34

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

2 回答 2

81

问题是 Node 包含很多关于其上下文的内部状态,包括他们的父母身份和拥有他们的文档。既不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 文档 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参数 oncloneNode()importNode()指定您是否需要深拷贝,即复制节点及其所有子节点。由于 99% 的时间你想要复制整个子树,你几乎总是希望这是真的。

于 2009-05-17T00:12:25.007 回答
4

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

您可能需要 cloneNode() 方法。

于 2009-05-16T20:40:06.890 回答