Добавить корневой элемент DOMDocument к другому DOMDocument

У меня есть 2 объекта "DOMDocument" - $ оригинал и $ дополнительно. Я хочу взять всех детей из дополнительного $ DOMDocument и добавить его в конец оригинального документа.

Мой план состоял в том, чтобы внедрить элемент дополнительного документа $. Я пытался использовать:

$root = $additional->documentElement;
$original->appendChild($root)

Но я получаю сообщение об ошибке, что appendChild ожидает объект DOMNode в качестве аргумента. Я пытался получить доступ к каждому ребенку документа через:

$additional->childNodes->item(0);

Но он возвращает объект DOMElement. Можете ли вы посоветовать, как получить объект класса DOMNode? Каков наиболее удобный способ выполнить эту операцию импорта?

$ оригинал XML выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<Product>
     <RecordReference>345345</RecordReference>
     <NotificationType>03</NotificationType>
     <NumberOfPages>100</NumberOfPages 
</Product>

$ дополнительный XML выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<MainSubject>
    <SubjectScheme>10</SubjectScheme>
</MainSubject>

Что я хочу иметь:

<?xml version="1.0" encoding="utf-8"?>
<Product>
     <RecordReference>345345</RecordReference>
     <NotificationType>03</NotificationType>
     <NumberOfPages>100</NumberOfPages>
     <MainSubject>
         <SubjectScheme>10</SubjectScheme>
     </MainSubject> 
</Product>

1 ответ

DOMElement - это DOMNode, DOMNode - это суперкласс. Вот несколько дочерних классов для элемента, текста и других узлов. Просто итерируйте, импортируйте и добавляйте их.

$targetDom = new DOMDocument();
$targetDom->loadXML('<root/>');

$sourceDom = new DOMDocument();
$sourceDom->loadXml('<items><child/>TEXT</items>');

foreach ($sourceDom->documentElement->childNodes as $child) {
  $targetDom->documentElement->appendChild(
    $targetDom->importNode($child, TRUE)
  );
}

Это работает и с элементом документа.

$targetDom = new DOMDocument();
$targetDom->loadXML('<root/>');

$sourceDom = new DOMDocument();
$sourceDom->loadXml('<items><child/>TEXT</items>');

$targetDom->documentElement->appendChild(
  $targetDom->importNode($sourceDom->documentElement, TRUE)
);

echo $targetDom->saveXml();

DOMDocument::importNode() создает копию предоставленного узла в контексте документа. Только узлы, принадлежащие документу, могут быть добавлены к нему.

Другие вопросы по тегам