如何用Java将DOM节点从一个文档复制到另一个文档?

问题描述 投票:30回答:2

我在将节点从一个文档复制到另一文档时遇到麻烦。我已经使用了Node中的acceptNode和importNode方法,但是它们不起作用。我也尝试了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);
}
java api dom copy
2个回答
75
投票

问题在于,节点的上下文包含许多内部状态,其中包括其父项和拥有它们的文档。 adoptChild()importNode()都没有将新节点放置在目标文档中的任何位置,这就是代码失败的原因。

由于要复制节点而不要将其从一个文档移动到另一个文档,因此需要采取三个不同的步骤...

  1. 创建副本
  2. 将复制的节点导入到目标文档中
  3. 将副本放置在新文档中的正确位置
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);
}

truecloneNode()上的importNode()参数指定是否要进行深层复制,即复制该节点及其所有子节点。由于您有99%的时间想要复制整个子树,因此几乎总是希望这是事实。


4
投票

adoptChild不创建重复项,它只是将节点移到另一个父级。

您可能想要cloneNode()方法。

© www.soinside.com 2019 - 2024. All rights reserved.