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 ...
- crear la copia
- Importe el nodo de copiado en el documento de destino
- 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.