2009-11-18 10 views
26

Hay algo que no entiendo completamente acerca de la clonación de nodos con la API API de PHP. Aquí hay un archivo de muestra que rápidamente duplica el problema que estoy atravesando.DOMElemento clonando y añadiendo: 'Error de documento incorrecto'

$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()); 

Cuando se ejecuta este pequeño fragmento se produce una excepción

Fatal error: Uncaught exception 'DOMException' with message 'Wrong Document Error'

¿No puedo agarrar un nodo de un documento, clonarlo, y luego se anexe a otro documento?

Respuesta

39

Utilice DOMDocument->importNode para importar el nodo en el otro documento antes de agregarlo al DOM.

+0

Perfecto, gracias. Estaba buscando a través de las API 'DOMNode' y' DOMElement' buscando algo que me permitiera hacer esto y (tontamente) nunca revisé los métodos 'DOMDocument' =/ –

+1

¿Dónde agregaste importNode? Lo agregué a mi código y sigo recibiendo el error. – NobleUplift

+0

@NobleUplift Debe llamar a 'importNode' para importar un nodo de un documento a otro. Después de eso, puede agregarlo como un niño donde desee. – Gumbo

0

Deberá adjuntar el resultado del método importNode al DOM. Tenga en cuenta que el método podría devolver false cuando no se puede importar

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

Si es necesario importar el nodo, toda ella es nodos secundarios (resursively) y/o atributos del nodo utilizan el segundo parámetro opcional deep:

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