2012-04-26 142 views
2

我决定用SimpleXMLElements无法做到这一点。我一直在阅读PHP DOMDocument手册,我认为我可以通过迭代来实现,但这似乎效率低下。有没有更好的方式不会发生在我身上?如何轻松地将两个具有相同父节点的XML文档合并到一个文档中?

伪码上下的迭代求解:

// 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> 

回答

2

作为您可以在两个文件之间识别的唯一通用节点,将会是根节点,如果我接受您的问题n精确而严格,因此解决方案如下:

<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> 

正如你可以看到,所述的树这两个文档都被保留下来,只有你描述的节点相同是根节点(实际上也是两个节点),所以它不会从第二个文档中接管,而只是它的子节点。

+0

谢谢,这个工程。我希望有一种不使用迭代的方法,但我想如果我想坚持标准而不使用DOMDocumentFragment :: appendXML()。 – 2012-04-26 22:46:27

+0

@ErikaE:从技术上讲,将XML放在那里也可以,但我认为这几乎是相同的例程,您需要迭代文档的元素子元素以获得“innerXML”。 – hakre 2012-04-26 22:48:23

相关问题