我正在处理一个已经创建了文档对象的。我必须能够将它的基本名称空间(属性名"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,因为它是操作XML的最快的标准方法。
注意:我使用的是最新的JDK。
编辑
删除了问题中与名称空间前缀有关的错误假设。
https://stackoverflow.com/questions/1492428
复制相似问题