Ответ 1
Используйте DOMDocument->importNode
, чтобы импортировать node в другой документ, прежде чем добавлять его в DOM.
Что-то я не совсем понимаю о node клонировании с PHP DOM api. Вот пример файла, который быстро дублирует проблему, с которой я сталкиваюсь.
$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" с сообщением "Неправильно Ошибка документа"
Могу ли я не взять node из документа, клонировать его, а затем добавить в другой документ?
Используйте DOMDocument->importNode
, чтобы импортировать node в другой документ, прежде чем добавлять его в DOM.
Вам нужно добавить в DOM результат метода importNode
. Имейте в виду, что метод может возвращать false, когда его нельзя импортировать
if ($importedNode = $doc2->importNode($root->cloneNode())) {
$root2->appendChild($importedNode);
}
Если вам нужно импортировать node, все его дочерние узлы (resursively) и/или атрибуты node используют необязательный второй параметр deep
:
if ($importedNode = $doc2->importNode($root->cloneNode(), true)) {
$root2->appendChild($importedNode);
}