Как я могу легко объединить два документа XML с одним и тем же родительским узлом в один документ?

Я решил, что нет никакого способа сделать это с помощью SimpleXMLElements. Я читал руководство по PHP DOMDocument, и я думаю, что могу сделать это с итерацией, но это кажется неэффективным. Есть ли лучший способ, который не для меня?

Итеративное решение Psuedocode-ish:

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

Поскольку единственным общим узлом, который вы могли бы идентифицировать между этими двумя файлами, был бы корневой узел, если я задам ваш вопрос точно и строго, поэтому решение будет:

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

Как вы можете видеть, деревья обоих документов сохранены, но только тот узел, который вы описываете как тот же, является корневым узлом (на самом деле это и два узла), поэтому он не переносится со второго документа, а только его дети.