web-dev-qa-db-ja.com

JavaでDOMノードをあるドキュメントから別のドキュメントにコピーするにはどうすればよいですか?

あるドキュメントから別のドキュメントにノードをコピーするのに問題があります。 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);
}
30
pablochan

問題は、Nodeのコンテキストに関する多くの内部状態が含まれていることです。これには、その親子関係と、それらが所有されているドキュメントが含まれます。 adoptChild()importNode()も、宛先ノードのドキュメントのどこにも新しいノードを配置しないため、コードが失敗します。

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

  1. コピーを作成する
  2. コピーしたノードを宛先ドキュメントにインポートします
  3. コピーしたものを新しいドキュメントの正しい位置に配置します
 for(Node n:nodesToCopy){
 //複製ノードを作成します
 Node newNode = n.cloneNode(true); 
 //新しいノードの所有権を宛先ドキュメントに転送します
 newDoc.adoptNode(newNode); 
 //新しいノードをターゲットドキュメント内の実際のアイテムにします
 newDoc.getDocumentElement()。appendChild(newNode); 
} 

Java Document APIでは、importNode()を使用して最初の2つの操作を組み合わせることができます。

 for(Node n:nodesToCopy){
 //複製ノードを作成し、
の所有権を転送先ドキュメントに転送します
 Node newNode = newDoc.importNode(n、true); 
 //新しいノードをターゲットドキュメントの実際のアイテムにします
 newDoc.getDocumentElement()。appendChild(newNode ); 
} 

cloneNode()importNode()trueパラメータは、ノードとそのすべての子をコピーすることを意味するディープコピーが必要かどうかを指定します。 99%の確率でサブツリー全体をコピーしたいので、ほとんどの場合、これをtrueにする必要があります。

71
Jherico

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

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

4
Uri