Проблема в том, что узлы содержат много внутреннего состояния относительно своего контекста, который включает их происхождение и документ, которым они принадлежат. Ни adoptChild()
, ни importNode()
не помещайте новый узел где-либо в целевом документе, поэтому ваш код не работает.
Поскольку вы хотите скопировать узел, а не перемещать его из одного документа в другой, вам необходимо выполнить три отдельных шага ...
- Создать копию
- Импорт скопированного узла в целевой документ
- Поместите скопированное в правильное положение в новом документе
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 позволяет комбинировать первые две операции, используя 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);
}
Параметр true
в cloneNode()
и importNode()
указывает, требуется ли вам глубокое копирование, то есть копировать узел и все его дочерние элементы. Поскольку в 99% случаев вы хотите скопировать целое поддерево, вы почти всегда хотите, чтобы это было правдой.