Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将名称空间添加到php dom中现有的xml节点_Php_Xml_Dom - Fatal编程技术网

将名称空间添加到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>