将名称空间添加到php dom中现有的xml节点
我有这个:将名称空间添加到php dom中现有的xml节点,php,xml,dom,Php,Xml,Dom,我有这个: <user> <!-- data here --> </user> 我想要这个: <namespace:user> <!-- data here --> </namespace:user> 我已尝试设置userdomnode的$prefix属性。但它没有效果。怎么做?我认为你不能改变,它。您必须更换这些元件。为此,需要所有元素节点(或要更改的节点): $xpath->evaluate
<user>
<!-- data here -->
</user>
我想要这个:
<namespace:user>
<!-- data here -->
</namespace:user>
我已尝试设置
user
domnode的$prefix
属性。但它没有效果。怎么做?我认为你不能改变,它。您必须更换这些元件。为此,需要所有元素节点(或要更改的节点):
$xpath->evaluate('/*')
计算并按文档顺序返回节点。这意味着我们在其子节点之前获得父节点。将列表转换为数组并将其反转
$nodes=array\u reverse(迭代器到数组($xpath->evaluate('//*'))代码>
现在,为每个元素在目标命名空间中创建一个替换
$replacement=$dom->createElements('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=
<?xml version="1.0"?>
<foo:user xmlns:foo="urn:foo" id="abc">
<foo:name>username</foo:name>
<!-- comment -->
</foo:user>