【问题标题】:How can I easily combine two XML documents with the same parent node into one document?如何轻松地将具有相同父节点的两个 XML 文档合并为一个文档?
【发布时间】:2012-05-07 15:59:03
【问题描述】:

我已经决定没有办法用 SimpleXMLElements 做到这一点。我一直在阅读 PHP DOMDocument 手册,我想我可以通过迭代来做到这一点,但这似乎效率低下。有没有更好的方法我没有想到?

伪代码迭代解决方案:

// two DOMDocuments with same root element
$parent = new ...
$otherParent = new ...

$children = $parent->getElementByTagName('child');
foreach ($children as $child) {
   $otherParent->appendChild($child);
}

为了清楚起见,我有两个看起来像这样的 XML 文档:

    <parent>
      <child>
        <childOfChild>
           {etc, more levels of nested XML trees possible}
        </childOfChild>
      </child>
      <child>
        <childOfChild>
           {etc, more levels possible}
        </childOfChild>
      </child>

</parent>

我想要这样的输出:

<parent>
  {all children of both original XML docs, order unimportant, that preserves any nested XML trees the children may have}
<parent>

【问题讨论】:

    标签: php xml domdocument


    【解决方案1】:

    如果我准确而严格地回答您的问题,那么您可以在两个文件之间识别的唯一公共节点将是根节点,因此解决方案是:

    <doc1:parent>
        <doc1:children>...</>
        <doc2:children>...</>
    </doc1:parent>
    

    你写的顺序并不重要,所以你可以在这里看到,doc2 在 doc1 之后。两个 SimpleXML 元素 $xml1$xml2 的示例代码,它们都包含上面的示例 XML 表单:

    $doc1 = dom_import_simplexml($xml1)->ownerDocument;
    foreach (dom_import_simplexml($xml2)->childNodes as $child) {
        $child = $doc1->importNode($child, TRUE);
        echo $doc1->saveXML($child), "\n";
        $doc1->documentElement->appendChild($child);
    }
    

    现在$doc1 包含此 XML 表示的文档:

    <?xml version="1.0"?>
    <parent>
          <child>
            <childOfChild>
               {etc, more levels of nested XML trees possible}
            </childOfChild>
          </child>
          <child>
            <childOfChild>
               {etc, more levels possible}
            </childOfChild>
          </child>
    
          <child>
            <childOfChild>
               {etc, more levels of nested XML trees possible}
            </childOfChild>
          </child>
          <child>
            <childOfChild>
               {etc, more levels possible}
            </childOfChild>
          </child>
    </parent>
    

    如您所见,两个文档的树都被保留了,只有您描述为 same 的节点是根节点(实际上也是两个节点),所以它不是从第二个文档,但只是它的子文档。

    【讨论】:

    • 谢谢,这行得通。我希望有一种不使用迭代的方法,但我想如果我想坚持标准而不使用 DOMDocumentFragment::appendXML() 是没有办法的。
    • @ErikaE:从技术上讲,也可以将 XML 放在那里,但我认为这几乎是相同的例程,您还需要遍历文档的子元素以获得“innerXML”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多