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()ため、コードが失敗します。

ノードをあるドキュメントから別のドキュメントに移動するのではなく、コピーする必要があるため、実行する必要がある 3 つの異なる手順があります...

  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 では、 を使用して最初の 2 つの操作を組み合わせることができます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パラメータ on cloneNode()andはimportNode()、ノードとそのすべての子をコピーすることを意味するディープ コピーが必要かどうかを指定します。99% の確率でサブツリー全体をコピーしたいので、ほとんどの場合、これが真であることを望みます。

于 2009-05-17T00:12:25.007 に答える
4

adaptChild は複製を作成せず、ノードを別の親に移動するだけです。

おそらく cloneNode() メソッドが必要です。

于 2009-05-16T20:40:06.890 に答える