問題は、Node がそのコンテキストに関する多くの内部状態を含んでいることです。これには、ノードの親子関係やノードが所有されているドキュメントが含まれます。adoptChild()
新しいノードを宛先ドキュメントのどこにも配置しないimportNode()
ため、コードが失敗します。
ノードをあるドキュメントから別のドキュメントに移動するのではなく、コピーする必要があるため、実行する必要がある 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% の確率でサブツリー全体をコピーしたいので、ほとんどの場合、これが真であることを望みます。