Java+DOM:如何设置(已创建)文档的基本命名空间?我尝试了以下方法:
我正在处理一个已经创建的文档对象。我必须能够将其基本命名空间(属性名称“xmlns”)设置为特定值。我的输入是DOM,类似于:
<root>...some content...</root>
我需要的是DOM,它类似于:
<root xmlns="myNamespace">...some content...</root>
就是这样。很简单,不是吗?错!不是用 DOM!
我尝试了以下方法:
1) Using 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转换为其他内容,更改那里的命名空间,然后将其转换回来。我需要DOM,因为它是操作XML的最快标准方法。
注意:我使用的是最新的 JDK。
编辑
从问题中删除了错误的假设,这与命名空间前缀有关。