あるドキュメントから別のドキュメントにノードをコピーするのに問題があります。 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);
}
問題は、Nodeのコンテキストに関する多くの内部状態が含まれていることです。これには、その親子関係と、それらが所有されているドキュメントが含まれます。 adoptChild()
もimportNode()
も、宛先ノードのドキュメントのどこにも新しいノードを配置しないため、コードが失敗します。
ノードをコピーして、1つのドキュメントから別のドキュメントに移動したくないので、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にする必要があります。
applyChildは複製を作成せず、ノードを別の親に移動するだけです。
おそらくcloneNode()メソッドが必要です。