1
我有這樣的:到XML的現有節點添加命名空間在PHP DOM
<user>
<!-- data here -->
</user>
我想這一點:
<namespace:user>
<!-- data here -->
</namespace:user>
我已經嘗試設置$prefix
user
DomnNode的屬性。但它沒有效果。怎麼做?
我有這樣的:到XML的現有節點添加命名空間在PHP DOM
<user>
<!-- data here -->
</user>
我想這一點:
<namespace:user>
<!-- data here -->
</namespace:user>
我已經嘗試設置$prefix
user
DomnNode的屬性。但它沒有效果。怎麼做?
我不認爲你可以改變它。您將不得不更換元素。爲了這一點,你需要的所有元素節點(或者你想改變的節點):
$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>