Клонирование и добавление DOMElement: «Неправильная ошибка документа» - PullRequest
29 голосов
/ 19 ноября 2009

Есть кое-что, что я не совсем понимаю в клонировании узлов с API PHP DOM. Вот пример файла, который быстро дублирует проблему, с которой я сталкиваюсь.

$doc  = new DOMDocument( '1.0', 'UTF-8' );
$root = $doc->createElement( 'root' ); // This doesn't work either $root = new DOMElement( 'root' );
$doc->appendChild( $root );

$doc2  = new DOMDocument( '1.0', 'UTF-8' );
$root2 = $doc2->createElement( 'root2' );
$doc2->appendChild( $root2 );

// Here comes the error
$root2->appendChild( $root->cloneNode() );

Когда вы запускаете этот маленький фрагмент, выдается исключение

Неустранимая ошибка: необработанное исключение «DOMException» с сообщением «Неверно Ошибка документа '

Могу ли я не извлечь узел из документа, клонировать его, а затем добавить его в другой документ?

Ответы [ 2 ]

48 голосов
/ 19 ноября 2009

Используйте DOMDocument->importNode для импорта узла в другой документ перед добавлением его в DOM.

0 голосов
/ 19 августа 2017

Вам нужно добавить результат метода importNode в DOM. Имейте в виду, что метод может возвращать значение false, если его нельзя импортировать

if ($importedNode = $doc2->importNode($root->cloneNode())) {
    $root2->appendChild($importedNode);
}

Если вам нужно импортировать узел, все его дочерние узлы (рекурсивно) и / или атрибуты узла используют необязательный второй параметр deep:

if ($importedNode = $doc2->importNode($root->cloneNode(), true)) {
    $root2->appendChild($importedNode);
}
...