2009-08-04 53 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"))