Вставить поддерево в дерево XML (DOM)

Miky

Guest
Вставить поддерево в дерево XML (DOM)

Есть два xml докумета, требуется вставить содержимое одного как поддерево в определенный_элемент другого.
1.xml
<root>
<sub id="a"></sub>
<sub id="b"></sub>
</root>

2.xml
<root2>
<some atr="val">some</some>
</root2>

На выходе должно быть:
<root>
<sub id="a"></sub>
<sub id="b">
<root2>
<some atr="val">some</some>
</root2>
</sub>
</root>

Элемент вставлять научился, находить определенный_элемент с помощью DOMXpath научился, поддерево вставить не получается. Помогите кто знает как, а то у меня начали уже появляться мыслишки, что это не реализуемо в DOM (непосредственно).

Использую DOM в PHP5, впрочем это не важно, если у кого есть опыт реализации подобного в DOM XML или любой другой реализации DOM, поделитесь примером.

Спасибо.
 

Julik

Guest
clone

Примерно так (в терминах PHP 4)

PHP:
//делаем копию DOM-узла, не привязанную к DOM-документу, аргумент указывает, создать ли копии всех дочерних узлов и атрибутов или нет
$childNodeCopy = $childNode->clone_node(true);

//вставляем ее в любой другой документ или узел
$newParentNode->append_child($childNodeCopy);
Во всех реализациях DOM должно быть то же самое, думаю что вышесказанное в php 5 будет звучать как cloneNode() и appendChild соответственно.
 

Miky

Guest
Нашел этот пример для php4 в мануале, поппытался его воспроизвести для php5, вот он в упащенном виде без XPAth:
PHP:
$xml=new DOMDocument();
$xml->load('./1.xml');

$xml2=new DOMDocument();
$xml2->load('./2.xml');

$root_list=$xml->getElementsByTagName('root');
$root2_list=$xml2->getElementsByTagName('root2');

$root=$root_list->item(0);
$root2=$root2_list->item(0);

$xml2_subtree=$root2->cloneNode(true);
$root->appendChild($xml2_subtree);
Выдает ошибку на эту строку $root->appendChild($xml2_subtree);

Fatal error: Uncaught exception 'DOMException' with message 'Wrong Document Error' in c:\dom.php:19 Stack trace: #0 {main} thrown in c:\dom.php on line 19

Кто понимает, что делаю не так?

Что то мне подсказывает что решение в методе DOMDocument->createDocumentFragment, если делать по анологии с DOMDocument->createElement, это будет примерно так:
PHP:
$xml=new DOMDocument();
$xml->load('./1.xml');

$xml2=new DOMDocument();
$xml2->load('./2.xml');

$root_list=$xml->getElementsByTagName('root');
$root=$root_list->item(0);
$xml2_subtree=$xml->createDocumentFragment();
$root->appendChild($xml2_subtree);
Интерпритатор выдает Warning, что мол твой documentFragment пуст, т.е. его нужно как-то заплнить, но как?

Подскажите как быть?

Спасибо.
 
Сверху