2011-09-03 80 views
0

如何重命名DOMDocument中的XML节点?在编写新节点之前,我想在XML文件中对节点进行备份。我有这个代码,我想将URLS节点重命名为URLS_BACKUP。在PHP中重命名XML DOM节点

function backup_urls($nodeid) { 

$dom = new DOMDocument(); 
$dom->load('communities.xml'); 

$dom->formatOutput = true; 
$dom->preserveWhiteSpace = true; 

// get document element 

$xpath = new DOMXPath($dom); 
$nodes = $xpath->query("//COMMUNITY[@ID='$nodeid']"); 

if ($nodes->length) { 

    $node = $nodes->item(0); 

    $xurls = $xpath->query("//COMMUNITY[@ID='$nodeid']/URLS"); 

    if ($xurls->length) { 
    /* rename URLS to URLS_BACKUP */ 

    } 

} 

$dom->save('communities.xml'); 
} 

XML文件具有这种结构。

<?xml version="1.0" encoding="ISO-8859-1"?> 
<COMMUNITIES> 
<COMMUNITY ID="c000002"> 
    <NAME>ID000002</NAME> 
    <TOP>192</TOP> 
    <LEFT>297</LEFT> 
    <WIDTH>150</WIDTH> 
    <HEIGHT>150</HEIGHT> 
    <URLS> 
    <URL ID="u000002"> 
     <NAME>Facebook.com</NAME> 
     <URLC>http://www.facebook.com</URLC> 
    </URL> 
    </URLS> 
</COMMUNITY> 
</COMMUNITIES> 

谢谢。

+0

必须使用replaceNode但你必须创建新的节点URL_BACKUP和克隆矿石副本的所有儿童在此节点表格前URLC – ZigZag

+0

@ user900898所以唯一的办法就是使节点的新副本,所有这一切嵌套在它。没有重命名。我必须复制然后删除,如果我想删除旧的节点。谢谢。 – user823527

回答

6

你阅读的fopen xml文件的整个列表,你所用的方法str_replace()函数

$ handle = fopen ('communities.xml', 'r'); 
while (! feof ($ handle)) 
{ 
     $ buffer = fgets ($ handle, 4012); 
     $ buffer = str_replace ("URLS", "URLS_BACKUP", $ buffer); 
} 
fclose ($ handle); 
$ dom-> save ('communities.xml'); 
1

这是不可能的DOM重命名节点。字符串函数可能工作,但最好的解决方案是创建一个新节点并替换旧节点。

$dom = new DOMDocument(); 
$dom->loadXml($xml); 
$xpath = new DOMXPath($dom); 

$nodeId = 'c000002'; 
$nodes = $xpath->evaluate("//COMMUNITY[@ID='$nodeid']/URLS"); 

// we change the document, iterate the nodes backwards 
for ($i = $nodes->length - 1; $i >= 0; $i--) { 
    $node = $nodes->item($i); 
    // create the new node 
    $newNode = $dom->createElement('URL_BACKUP'); 
    // copy all children to the new node 
    foreach ($node->childNodes as $childNode) { 
    $newNode->appendChild($childNode->cloneNode(TRUE)); 
    } 
    // replace the node 
    $node->parentNode->replaceChild($newNode, $node); 
} 

echo $dom->saveXml();