2014-02-10 115 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> 
相关问题