2009-11-18 15 views
26

Jest coś, czego nie rozumiem w pełni przy klonowaniu węzłów za pomocą aplikacji DOM DOM aplikacji PHP. Oto przykładowy plik, który szybko duplikuje pojawiający się problem.Klonowanie i dołączanie DOMElement: "Błędny błąd dokumentu"

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

Po uruchomieniu ten mały fragment na wyjątek

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

Nie mogę złapać węzeł z dokumentu, sklonować go, a następnie dołączyć go do innego dokumentu?

Odpowiedz

39

Użyj DOMDocument->importNode, aby zaimportować węzeł do innego dokumentu przed dodaniem go do DOM.

+0

Idealny, dzięki. Przeszukiwałem interfejsy 'DOMNode' i' DOMElement' szukając czegoś, co pozwoliłoby mi to zrobić i (głupio) nigdy nie sprawdzałem metod 'DOMDocument' =/ –

+1

Gdzie dodałeś funkcję importNode? Dodałem go do mojego kodu i nadal dostaję błąd. – NobleUplift

+0

@NobleUplift Musisz wywołać 'importNode', aby zaimportować węzeł z jednego dokumentu do innego dokumentu. Potem możesz dodać ją jako dziecko tam, gdzie chcesz. – Gumbo

0

Będzie trzeba dodać wynik metody importNode do DOM. Należy pamiętać, że metoda może return false, gdy nie mogą być importowane

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

Jeśli chcesz zaimportować węzeł, wszystkich jego węzłów potomnych (resursively) i/lub atrybuty węzła wykorzystać opcjonalny drugi parametr deep:

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