Klonen und Anhängen von DOMElement: „Falscher Dokumentfehler“

Lesezeit: 2 Minuten

Benutzer-Avatar
Peter Bailey

Es gibt etwas, das ich beim Klonen von Knoten mit der DOM-API von PHP nicht ganz verstehe. Hier ist eine Beispieldatei, die das Problem, auf das ich stoße, schnell dupliziert.

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

Wenn Sie dieses kleine Snippet ausführen, wird eine Ausnahme ausgelöst

Schwerwiegender Fehler: Nicht abgefangene Ausnahme ‘DOMException’ mit der Meldung ‘Wrong Document Error’

Kann ich einen Knoten nicht aus einem Dokument ziehen, klonen und dann an ein anderes Dokument anhängen?

Verwenden DOMDocument->importNode um den Knoten in das andere Dokument zu importieren, bevor Sie ihn dem DOM hinzufügen.

  • Perfekt danke. Ich habe die durchsucht DOMNode und DOMElement APIs, die nach etwas suchen, mit dem ich dies tun könnte, und das (dummerweise) nie überprüft haben DOMDocument Methoden =/

    – Peter Bailey

    18. November 2009 um 21:31 Uhr

  • Wo hast du importNode hinzugefügt? Ich habe es meinem Code hinzugefügt und bekomme immer noch den Fehler.

    – NobleUplift

    8. Januar 2014 um 17:54 Uhr

  • @NobleUplift Du musst anrufen importNode um einen Knoten von einem Dokument in ein anderes Dokument zu importieren. Danach können Sie es als untergeordnetes Element anhängen, wo Sie möchten.

    – Gumbo

    8. Januar 2014 um 18:42 Uhr

  • Ich arbeitete an tief verschachtelten Tags, also musste ich anrufen $parent->ownerDocument->importNode($child, true) und dann konnte ich es hinzufügen.

    – NobleUplift

    8. Januar 2014 um 19:48 Uhr

Sie müssen das Ergebnis von anhängen importNode Methode zum DOM. Beachten Sie, dass die Methode false zurückgeben kann, wenn sie nicht importiert werden kann

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

Wenn Sie den Knoten importieren müssen, verwenden alle untergeordneten Knoten (resursiv) und/oder die Attribute des Knotens den optionalen zweiten Parameter deep:

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

1246140cookie-checkKlonen und Anhängen von DOMElement: „Falscher Dokumentfehler“

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy