Из того, что я знаю, чистый SimpleXMLElement не позволяет импортировать узлы из другого документа из коробки, но DOMDocument делает это.
К счастью, оба хорошо работают вместе, SimpleXMLElement можно «превратить» в DOMNode и наоборот. -versa.
Это то, для чего предназначена функция dom_import_simplexml()
.
Вот пример, который относится к примеру, который у вас есть в вашем вопросе, но вместо использованияSimpleXML::addChild()
импорт в DOM и добавление (снова импортированного) дочернего элемента в узел DOMElement:
$parent = dom_import_simplexml($newFave); # [1]
$parent->appendChild( # [2]
$parent->ownerDocument->importNode(dom_import_simplexml($animal), true) # [3]
);
echo $personXML->asXML(); # [4]
- создание узла DOM для родительского элемента
<favourites>
- appendдочерний узел родительского узла DOM
- создает и импортирует любимый узел DOM животного. Узел необходимо сначала импортировать в родительский документ, поскольку он является частью другого DOMDocument, и добавление дочерних узлов возможно только в том случае, если узлы являются частью одного и того же документа.
- вывод сthe SimpleXMLElement
Результат (напечатанный безобразно) выглядит так:
...
<personL letter="A">
<fullname>
<firstname>Summer</firstname>
<lastname>Smith</lastname>
</fullname>
<favourites>
<color>pink</color>
</favourites>
<favourites><animal>cat</animal></favourites></personL>
^ ^
| |
| $animal = $faveXML->personN[0]->animal;
| $parent->ownerDocument
| ->importNode(dom_import_simplexml($animal), true)
|
|
$newFave = $personXML->personN->personL[0]->addChild("favourites");
...
Надеюсь, за этим легко следить. Это то, что @ThW предлагает в своем ответе, но использует DOMDocument только для той части, где SimpleXMLElement не может выполнить эту работу.
Также мне нравится его предложение не добавлять элемент избранного снова и снова. Так что для более динамичного подхода к добавлению избранных лиц по количеству людей в этих двух XML-документах давайте добавим к смеси немного Xpath:
foreach ($faveXML->xpath('./personN[*]') as $person) {
foreach ($personXML->xpath(
sprintf('./personN[@number = "%d"]/*/favourites[1]', $person['number'])
) as $favourites) {
$parent = dom_import_simplexml($favourites);
$parent->appendChild(
$parent->ownerDocument->importNode(dom_import_simplexml($person->children()[0]), true)
);
}
};