【问题标题】:Add namespace to a existing node of xml in php dom将命名空间添加到 php dom 中 xml 的现有节点
【发布时间】:2023-03-22 05:47:01
【问题描述】:

我有这个:

<user>
     <!-- data here -->
</user>

我想要这个:

<namespace:user>
    <!-- data here -->
</namespace:user>

我尝试设置userDomnNode 的$prefix 属性。但它没有效果。怎么做?

【问题讨论】:

    标签: php xml dom


    【解决方案1】:

    我不认为你可以改变,它。您将不得不更换元素。为此,您需要所有元素节点(或要更改的节点):

    $xpath-&gt;evaluate('//*')

    Evaluate 按文档顺序返回节点。这意味着我们在子节点之前获得父节点。将列表转换为数组并反转它。

    $nodes = array_reverse(iterator_to_array($xpath-&gt;evaluate('//*')));

    现在为每个元素在目标命名空间中创建一个替换

    $replacement = $dom-&gt;createElementNS('urn:foo', 'foo:'.$node-&gt;localName);

    获取所有子节点和属性节点并将它们附加到替换:

    foreach ($xpath->evaluate('node()|@*', $node) as $childNode) {
      $replacement->appendChild($childNode);
    }
    

    最后,用新的节点替换原来的节点:

    $node-&gt;parentNode-&gt;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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多