我正在处理一个已经创建的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!
有什么方法可以递归地执行此操作(无需编写自己的递归方法)?
请帮忙 ;)
请不要建议我做一些花哨的解决方法,例如将 DOM 转换为其他东西,更改那里的名称空间,然后将其转换回来。我需要 DOM,因为它是操作 XML 的最快标准方法。
注意:我使用的是最新的 JDK。
编辑
从问题中删除了错误的假设,这与命名空间前缀有关。