2009-05-16 10 views
21

Ho problemi con la copia di nodi da un documento a un altro. Ho usato entrambi i metodi adoptNode e importNode dal nodo, ma non funzionano. Ho anche provato appendChild ma questo genera un'eccezione. Sto usando Xerces. Non è implementato lì? c'è un altro modo per fare ciò?Come si copiano i nodi DOM da un documento all'altro in Java?

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

risposta

58

Il problema è che i nodi contengono molto stato interno sul loro contesto, che include la loro parentela e il documento di cui sono proprietari. Né adoptChild()importNode() posizionare il nuovo nodo ovunque nel documento di destinazione, motivo per cui il codice non funziona.

Dal momento che si desidera copiare il nodo e non spostarlo da un documento all'altro ci sono tre fasi distinte che dovete prendere ...

  1. creare la copia
  2. Importa il nodo copiato nella documento di destinazione
  3. Posizionare il copiato in che sia corretta posizione nel nuovo documento
 
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); 
} 

Java Document API consente di combinare le prime due operazioni utilizzando 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); 
} 

Il parametro true su cloneNode() e importNode() specifica se si desidera una copia completa, nel senso di copiare il nodo e tutto ciò che per bambini. Dal momento che il 99% delle volte si desidera copiare un'intera sottostruttura, quasi sempre si vuole che questo sia vero.

4

adoptChild non crea un duplicato, sposta semplicemente il nodo su un altro genitore.

Probabilmente si desidera il metodo cloneNode().

Problemi correlati