Подтвердить что ты не робот

Как скопировать DOM-узлы из одного документа в другой в Java?

У меня возникают проблемы с копированием узлов из одного документа в другой. Я использовал методы acceptNode и importNode из Node, но они не работают. Я также попробовал appendChild, но это исключение. Я использую Xerces. Разве это не реализовано? Есть ли другой способ сделать это?

List<Node> nodesToCopy = ...;
Document newDoc = ...;
for(Node n : nodesToCopy) {
    // this doesn't work
    newDoc.adoptChild(n);
    // neither does this
    //newDoc.importNode(n, true);
}
4b9b3361

Ответ 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% времени, когда вы хотите скопировать целое поддерево, вы почти всегда хотите, чтобы это было правдой.

Ответ 2

acceptChild не создает дубликат, он просто перемещает node в другой родитель.

Вероятно, вам нужен метод cloneNode().