既に作成されたDocument オブジェクトを扱っています。そのベース名前空間 (属性名「xmlns」) を特定の値に設定できる必要があります。私の入力はDOMで、次のようなものです:
<root>...some content...</root>
私が必要としているのは、次のような DOM です。
<root xmlns="myNamespace">...some content...</root>
それでおしまい。簡単ですね。違う!DOMではありません!
私は次のことを試しました:
1) doc.getDocumentElement().setAttribute("xmlns","myNamespace") の使用
空の xmlns を持つドキュメントを取得します (他の属性名でも機能します! )
<root xmlns="">...</root>
2) renameNode(...) の使用
最初にドキュメントを複製します。
Document input = /*that external Document whose namespace I want to alter*/;
DocumentBuilderFactory BUILDER_FACTORY_NS = DocumentBuilderFactory.newInstance();
BUILDER_FACTORY_NS.setNamespaceAware(true);
Document output = BUILDER_NS.newDocument();
output.appendChild(output.importNode(input.getDocumentElement(), true));
本当に document.clone() がありませんが、おそらくそれは私だけです。
ルート ノードの名前を変更します。
output.renameNode(output.getDocumentElement(),"myNamespace",
output.getDocumentElement().getTagName());
今、それは簡単ではありませんか?;)
私が今得たものは次のとおりです。
<root xmlns="myNamespace">
<someElement xmlns=""/>
<someOtherElement xmlns=""/>
</root>
したがって(私たち全員が予想したとおりですよね?) 、これにより、ルート ノードの名前空間のみが名前変更されます。
のろい、ドム!
これを再帰的に行う方法はありますか (独自の再帰メソッドを記述せずに)?
助けてください ;)
DOM を別のものに変換し、そこで名前空間を変更して元に戻すなど、手の込んだ回避策を実行するようにアドバイスしないでください。XML を操作するための最速の標準的な方法であるため、DOM が必要です。
注: 最新の JDK を使用しています。
編集名前空間プレフィックス
に関係する質問から間違った仮定を削除しました。