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()
né 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 ...
- creare la copia
- Importa il nodo copiato nella documento di destinazione
- 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.