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>