用php和dom处理xml文件

用php和dom处理xml文件,php,xml,Php,Xml,我有如下XML文件: <?xml version="1.0" encoding="UTF-8"?> <root version="8.0.0.0"> <songs name="Album"> <row> <song artist="artist_name">Track1</song> </row> <row> <song artist="artist_name">

我有如下XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<root version="8.0.0.0">
<songs name="Album">
  <row>
    <song artist="artist_name">Track1</song>
  </row>
  <row>
    <song artist="artist_name">Track2</song>
  </row>
  <row>
    <song artist="artist_name">Track3</song>
  </row>
  <row>
    <song artist="artist_name">Track4</song>
  </row>
</songs>
</root>

轨道1
轨道2
轨道3
轨道4
现在我想用更多的行更新这个文件。如何在现有行元素的顶部追加数据?另外,在添加新元素时,我想检查像-Track1、Track2这样的轨迹是否重复

目前,我正在使用php:dom处理这个xml文件,但它在现有行的底部追加数据

用来做上述事情的PHP代码是

<?php
 //Creates XML string and XML document using the DOM 
 $dom = new DOMDocument(); 
 $dom->formatOutput = true;
 $dom->Load('C:/wamp/www/xml/test1.xml');

 $root = $dom->firstChild;
 $list = $root->childNodes->item(1);


if(isset($_POST['submit'])){

    $artistName = $_POST['name'];
    $track = $_POST['track'];
    $row = $dom->createElement('row');
    $list->appendChild($row);
    $song = $dom->createElement('song'); 
    $row->appendChild($song);
    $song->setAttribute('artist', $artistName);
    $wcm_node = $dom->createTextNode($track);
    $song->appendChild($wcm_node);
 }

// Code to format XML after appending data
$outXML = $dom->saveXML(); // put string in outXML 

//now create a brand new XML document
$xml = new DOMDocument(); 
$xml->preserveWhiteSpace = false; 
$xml->formatOutput = true; //yup, going to try to make this format again
//pass the output of the first bunch of stuff we did to the new XML document:
$xml->loadXML($outXML); 
//now display the cleanly formatted output without using LIBXML_NOBLANKS (which may have undesired consequences
$xml->save('test1.xml'); // save as file 

}

?>
formatOutput=true;
$dom->Load('C:/wamp/www/xml/test1.xml');
$root=$dom->firstChild;
$list=$root->childNodes->item(1);
如果(isset($_POST['submit'])){
$artistName=$_POST['name'];
$track=$_POST['track'];
$row=$dom->createElement('row');
$list->appendChild($row);
$song=$dom->createElement('song');
$row->appendChild($song);
$song->setAttribute($artist',$artistName);
$wcm_node=$dom->createTextNode($track);
$song->appendChild($wcm_节点);
}
//附加数据后格式化XML的代码
$outXML=$dom->saveXML();//将字符串放入outXML
//现在创建一个全新的XML文档
$xml=newdomdocument();
$xml->preserveWhiteSpace=false;
$xml->formatOutput=true//是的,我要再次尝试制作这种格式
//将我们所做的第一批工作的输出传递给新的XML文档:
$xml->loadXML($outXML);
//现在,在不使用LIBXML_NOBLANKS的情况下显示干净格式的输出(这可能会产生不期望的结果)
$xml->save('test1.xml');//另存为文件
}
?>
请让我知道,我怎么做

谢谢,这不是追加而是预加。DOM也有一种方法:

示例():

$dom=新的DOMDocument;
$dom->loadXml(“”);
$dom->documentElement->insertBefore(
$dom->createElement('行','新行'),
$dom->getElementById('r1')
);
$dom->formatOutput=TRUE;
echo$dom->saveXml();
输出:

<?xml version="1.0"?>
<rows>
  <row>new row</row>
  <row xml:id="r1"/>
</rows>

新行

Hi Gordon的可能重复项..它不起作用,因为我在xml中没有任何id可查找和附加?在???@techiepark之后,我还能做些什么来附加新元素吗?你的具体标记是不相关的。如果你看链接的手册,你会看到上面写着“引用节点”,因此您只需传入希望在之前插入新元素的节点。如何获取该节点取决于您。任何从DOMDocument返回DOMEElement的方法都可以。
<?xml version="1.0"?>
<rows>
  <row>new row</row>
  <row xml:id="r1"/>
</rows>