2009-08-04 76 views
0

我有类似的东西作为输入:Java + DOM:我如何优雅地重命名xmlns:xyz属性?

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

回答

1

在DOM中找不到xmlns属性,它们不是DOM的一部分。

如果您找到想要的节点(getElementsByTagNameNS)并将其qualifiedName(qname)设置为包含您喜欢的前缀的新值,那么您可能会获得一些成功。然后重新生成XML文档。

顺便说一句,当使用任何理智的XML解析器时,命名空间前缀(这就是你想要改变的东西)在很大程度上是不相关的。命名空间URI是重要的。为什么你想要将前缀设置为特定值?

+0

下工作,可以根据您的例子(未经测试)更友好的版本替换的命名空间。谢谢你的回答! – 2009-08-04 18:53:13

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作为正常完成。如果你只是在应该完成这项工作的人类可读输出之后。但是,如果您需要转回,您可能会遇到问题。因为我需要在某些特殊情况用户可读的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"))