我有类似的东西作为输入:
<root xmlns="urn:my:main"
xmlns:a="urn:my:a" xmlns:b="urn:my:b">
...
</root>
希望有类似的东西作为输出:
<MY_main:root xmlns:MY_main="urn:my:main"
xmlns:MY_a="urn:my:a" xmlns:MY_b="urn:my:b">
...
</MY_main:root>
......或者反过来。
如何以优雅的方式使用DOM实现这一目标? 即,不搜索以“xmlns”开头的属性名称。
答案 0 :(得分:1)
您不会在DOM中找到xmlns属性,它们不是DOM的一部分。
如果找到所需的节点(getElementsByTagNameNS)并将其qualifiedName(qname)设置为包含您喜欢的前缀的新值,则可能会取得一些成功。然后重新生成XML文档。
顺便说一句,在使用任何理智的XML解析器时,名称空间前缀(这是您尝试更改的内容)在很大程度上无关紧要。命名空间URI是重要的。为什么要将前缀设置为特定值?
答案 1 :(得分:0)
我使用了以下jdom存根来删除所有命名空间引用:
Element rootElement = new SAXBuilder().build(contents).getRootElement();
for (Iterator i = rootElement.getDescendants(new ElementFilter()); i.hasNext();) {
Element el = (Element) i.next();
if (el.getNamespace() != null) el.setNamespace(null);
}
return rootElement;
正常读取和写入xml。如果你只是在人类可读的输出后应该做的工作。但是,如果您需要转换回来,则可能存在问题。
以下内容可能会根据您的示例(未经测试)使用更友好的版本替换命名空间:
rootElement.setNamespace(Namespace.getNamespace("MY_Main", "urn:my:main"));
rootElement.addNamespaceDeclaration(Namespace.getNamespace("MY_a", "urn:my:a"))
rootElement.addNamespaceDeclaration(Namespace.getNamespace("MY_b", "urn:my:b"))