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