2009-05-16 19 views
21

Tengo problemas para copiar nodos de un documento a otro. He usado los métodos adoptNode e importNode desde Node pero no funcionan. También probé appendChild, pero eso arroja una excepción. Estoy usando Xerces. ¿Esto no está implementado allí? Hay otra manera de hacer esto?¿Cómo copio nodos DOM de un documento a otro en Java?

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

Respuesta

58

El problema es que los nodos contienen una gran cantidad de estado interno sobre su contexto, que incluye su origen y el documento por el que se poseen. Ni adoptChild() ni importNode() colocan el nuevo nodo en ninguna parte del documento de destino, por lo que su código está fallando.

Puesto que usted quiere copiar el nodo y no moverlo de un documento a otro hay tres etapas distintas que hay que tener ...

  1. crear la copia
  2. Importe el nodo de copiado en el documento de destino
  3. Coloque la copia en su posición correcta en el nuevo 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); 
} 

La API de documentos de Java le permite combinar las dos primeras operaciones usando 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); 
} 

El parámetro true en cloneNode() y importNode() especifica si desea una copia profunda, lo que significa que copiar el nodo y todos sus hijos. Dado que el 99% del tiempo desea copiar un subárbol completo, casi siempre quiere que esto sea cierto.

4

adoptChild no crea un duplicado, simplemente mueve el nodo a otro elemento primario.

Probablemente desee el método cloneNode().

Cuestiones relacionadas