Problem polega na tym, że Węzeł zawiera dużo wewnętrznego stanu dotyczącego ich kontekstu, który obejmuje ich pochodzenie oraz dokument, w którym są własnością. Ani adoptChild()
ani importNode()
nie umieść nowego węzła w dowolnym miejscu w dokumencie docelowym, dlatego kod zawodzi.
Ponieważ chcesz skopiować węzeł i nie przenieść go z jednego dokumentu do drugiego istnieją trzy odrębne etapy, które trzeba wziąć ...
- Tworzenie kopii
- importu skopiowany węzła z dokument docelowy
- Umieść kopiowane do swojego prawidłowego położenia w nowym dokumencie
for(Node n : nodesToCopy) {
// Create a duplicate node
Node newNode = n.cloneNode(true);
// Transfer ownership of the new node into the destination document
newDoc.adoptNode(newNode);
// Make the new node an actual item in the target document
newDoc.getDocumentElement().appendChild(newNode);
}
Interfejs API dokumentu Java pozwala łączyć pierwsze dwie operacje przy użyciu importNode()
.
for(Node n : nodesToCopy) {
// Create a duplicate node and transfer ownership of the
// new node into the destination document
Node newNode = newDoc.importNode(n, true);
// Make the new node an actual item in the target document
newDoc.getDocumentElement().appendChild(newNode);
}
Parametr true
na cloneNode()
i importNode()
określa, czy mają głęboką kopię, czyli skopiować węzeł i wszystkie jego dzieci. Ponieważ 99% czasu chcesz skopiować cały poddrzew, prawie zawsze chcesz, aby było to prawdą.