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

时间:2009-05-16 20:35:59

标签: java api dom copy

我将节点从一个文档复制到另一个文档时遇到了问题。我已经使用了Node的adoptNode和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);
}

2 个答案:

答案 0 :(得分:69)

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

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

  1. 创建副本
  2. 将复制的节点导入目标文档
  3. 将复制的内容放入新文档中的正确位置
  4. 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%的时间你想复制整个子树,你几乎总是希望这是真的。

答案 1 :(得分:4)

adoptChild不会创建副本,只是将节点移动到另一个父节点。

您可能需要cloneNode()方法。