Я решил, что нет никакого способа сделать это с помощью 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>
Как вы можете видеть, деревья обоих документов сохранены, но только тот узел, который вы описываете как тот же, является корневым узлом (на самом деле это и два узла), поэтому он не переносится со второго документа, а только его дети.