2014-02-10 111 views

回答

0

我不認爲你可以改變它。您將不得不更換元素。爲了這一點,你需要的所有元素節點(或者你想改變的節點):

$xpath->evaluate('//*')

評估文檔順序返回節點。這意味着我們在他們的孩子面前獲得父節點。將列表轉換爲數組並將其反轉。

$nodes = array_reverse(iterator_to_array($xpath->evaluate('//*')));

現在,每一個元素創建目標命名空間

$replacement = $dom->createElementNS('urn:foo', 'foo:'.$node->localName);

更換獲取所有的孩子和屬性節點,並把它們添加到更換:

foreach ($xpath->evaluate('node()|@*', $node) as $childNode) { 
    $replacement->appendChild($childNode); 
} 

末,用新的節點替換原始節點:

$node->parentNode->replaceChild($replacement, $node);

完整例如:

$xml = <<<'XML' 
<user id="abc"> 
    <name>username</name> 
    <!-- comment --> 
</user> 
XML; 

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

$nodes = array_reverse(
    iterator_to_array(
    $xpath->evaluate('//*') 
) 
); 

foreach ($nodes as $node) { 
    $replacement = $dom->createElementNS('urn:foo', 'foo:'.$node->localName); 
    foreach ($xpath->evaluate('node()|@*', $node) as $childNode) { 
    $replacement->appendChild($childNode); 
    } 
    $node->parentNode->replaceChild($replacement, $node); 
} 

echo $dom->saveXml(); 

輸出:

<?xml version="1.0"?> 
<foo:user xmlns:foo="urn:foo" id="abc"> 
    <foo:name>username</foo:name> 
    <!-- comment --> 
</foo:user> 
相關問題