2009-11-18 10 views
26

C'è qualcosa che non capisco del clonaggio dei nodi con il DOM API di PHP. Ecco un file di esempio che duplica rapidamente il problema che sto incontrando.Clonazione e aggiunta di DOMElement: 'Errore documento errato'

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

Quando si esegue questo piccolo frammento viene generata un'eccezione

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

Non posso afferrare un nodo da un documento, clonarlo, e poi aggiungerla ad un altro documento?

risposta

39

Utilizzare DOMDocument->importNode per importare il nodo nell'altro documento prima di aggiungerlo al DOM.

+0

Perfetto, grazie. Stavo cercando tra le API 'DOMNode' e' DOMElement' alla ricerca di qualcosa che mi permettesse di farlo e (follemente) non ho mai controllato i metodi 'DOMDocument' =/ –

+1

Dove hai aggiunto importNode? L'ho aggiunto al mio codice e sto ancora ricevendo l'errore. – NobleUplift

+0

@NobleUplift È necessario chiamare 'importNode' per importare un nodo da un documento a un altro documento. Dopo di che puoi aggiungerlo come un bambino dove vuoi. – Gumbo

0

È necessario aggiungere il risultato del metodo importNode al DOM. Tenete a mente che il metodo potrebbe restituire false quando non può essere importato

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

Se è necessario importare il nodo, tutto questo è nodi figlio (resursively) e/o gli attributi del nodo utilizzare il secondo parametro opzionale deep:

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