Java + DOM:如何优雅地重命名xmlns:xyz属性?

时间:2009-08-04 18:41:58

标签: java xml dom namespaces

我有类似的东西作为输入:

<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”开头的属性名称。

2 个答案:

答案 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"))