recorrer - ¿Cómo copio los nodos DOM de un documento a otro en Java?
nodelist java (2)
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 son propiedad. Ni adoptChild()
ni importNode()
colocan el nuevo nodo en ningún lugar del documento de destino, por lo que su código está fallando.
Dado que desea copiar el nodo y no moverlo de un documento a otro, hay tres pasos distintos que debe seguir ...
- Crear la copia
- Importe el nodo 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); }
El Java Document API 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()
e importNode()
especifica si desea una copia profunda, lo que significa copiar el nodo y todo lo que es secundario. Como el 99% del tiempo que desea copiar un subárbol completo, casi siempre desea que esto sea cierto.
Tengo problemas para copiar nodos de un documento a otro. He utilizado los métodos adoptNode e importNode de Node pero no funcionan. También he intentado appendChild pero que lanza una excepción. Estoy usando Xerces. ¿Esto no está implementado allí? Hay otra manera de hacer esto?
List<Node> nodesToCopy = ...;
Document newDoc = ...;
for(Node n : nodesToCopy) {
// this doesn''t work
newDoc.adoptChild(n);
// neither does this
//newDoc.importNode(n, true);
}
adoptChild no crea un duplicado, solo mueve el nodo a otro padre.
Probablemente quieras el método cloneNode ().