2012-04-26 140 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

相關問題