2009-05-16 12 views
21

Mam problem z kopiowaniem węzłów z jednego dokumentu do drugiego. Użyłem obu metod adoptNode i importNode z węzła, ale one nie działają. Próbowałem również appendChild, ale to rzuca wyjątek. Używam Xerces. Czy to nie jest tam realizowane? Czy jest inny sposób na zrobienie tego?Jak kopiować węzły DOM z jednego dokumentu do drugiego w Javie?

List<Node> nodesToCopy = ...; 
Document newDoc = ...; 
for(Node n : nodesToCopy) { 
    // this doesn't work 
    newDoc.adoptChild(n); 
    // neither does this 
    //newDoc.importNode(n, true); 
} 

Odpowiedz

58

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ąć ...

  1. Tworzenie kopii
  2. importu skopiowany węzła z dokument docelowy
  3. 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ą.

4

adoptChild nie tworzy duplikatów, po prostu przenosi węzeł do innego rodzica.

Prawdopodobnie potrzebujesz metody cloneNode().

Powiązane problemy