douxuan4556 2015-11-17 20:13
浏览 43
已采纳

PHP中的XML克隆节点

I have to clone an XML node and its childs and append it to a new XML in a specifics tag.

Ie:

Source XML:

<root>
  <element>
    <back>
    <item1>ABC</item1>
    <item2>DEF</item2>
    <more>
      <moreitem>GHI</moreitem>
    </more
    </back>
  </element>
</root>

Destination XML:

<root>
  <base1>
    <item1>FOO</item1>
    <item2>BAR</item2>
  <base2>
    **<back>From source XML and all its childs here</back>**
  </base2>
  </base1>
<root>
  • 写回答

3条回答 默认 最新

  • duanping5306 2015-11-17 20:29
    关注

    DOMXpath::evaluate() allows you to fetch nodes using Xpath expressions. DOMDocument::importNode() duplicates a node and imports a node into a target document. DOMNode::cloneNode() create a duplicate of node to add in the same document. DOMNode::appendChild() allows you to append the imported/cloned node.

    $source = <<<'XML'
    <root>
      <element>
        <back>
        <item1>ABC</item1>
        <item2>DEF</item2>
        <more>
          <moreitem>GHI</moreitem>
        </more>
        </back>
      </element>
    </root>
    XML;
    
    $target = <<<'XML'
    <root>
      <base1>
        <item1>FOO</item1>
        <item2>BAR</item2>
        <base2>
        </base2>
      </base1>
    </root>
    XML;
    
    $sourceDocument = new DOMDocument();
    $sourceDocument->loadXml($source);
    $sourceXpath = new DOMXpath($sourceDocument);
    
    $targetDocument = new DOMDocument();
    $targetDocument->loadXml($target);
    $targetXpath = new DOMXpath($targetDocument);
    
    foreach ($targetXpath->evaluate('/root/base1/base2[1]') as $targetNode) {
      foreach ($sourceXpath->evaluate('/root/element/back') as $backNode) {
        $targetNode->appendChild($targetDocument->importNode($backNode, TRUE));
      }
    }
    
    echo $targetDocument->saveXml();
    

    Output:

    <?xml version="1.0"?>
    <root>
      <base1>
        <item1>FOO</item1>
        <item2>BAR</item2>
        <base2>
          <back>
            <item1>ABC</item1>
            <item2>DEF</item2>
            <more>
              <moreitem>GHI</moreitem>
            </more>
          </back>
        </base2>
      </base1>
    </root>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?