2013-08-22 20 views
0

有沒有辦法獲取XML文檔中使用的前綴/名稱空間綁定,最好使用標準的org.w3c.orgjavax.xml API?我知道前綴可以在包含的元素中重新定義,所以API也應該能夠解釋這一點。獲取XML文檔中使用的前綴/名稱空間綁定,最好使用org.w3c.dom和javax.xml API

我正在尋找一個代碼片斷,它將以某種序列化的形式獲取XML文檔,並返回前綴到URI名稱綁定的一個Map<String, String>(加上一些額外的聰明在API中以說明封閉元素中的重新定義)。理想情況下,庫可能能夠做更有趣的事情,比如識別/清除未使用的綁定,將重複的綁定移動到最近的共同祖先(而不是讓它們遍佈整個地方)等等。

回答

1

這裏是一個開始,使用Guava MultiMap

Document doc = ...; 

Multimap<String, String> bindings = LinkedHashMultimap.create(); 
DocumentTraversal dt = (DocumentTraversal) doc; 
NodeIterator i = dt.createNodeIterator(doc, NodeFilter.SHOW_ELEMENT, 
     null, false); 
Element element = (Element) i.nextNode(); 
while (element != null) { 
    String prefix = element.getPrefix(); 
    if (prefix != null) { 
     String uri = element.getNamespaceURI(); 
     bindings.put(prefix, uri); 
    } 
    element = (Element) i.nextNode(); 
} 

這隻會拿起但在效果上的綁定,也不會綁定任何默認命名空間(可以是固定的課程)。綁定的重新定義將以文檔順序表示,但不是它們發生的深度。

我想這個方法的進一步改進取決於你的用例,你有什麼更多的信息可以使重新定義的綁定變得明智嗎?

+0

然而,片段會生成實際使用的前綴(如您所說的「實際上」),而不是定義的前綴,在我的情況下,我試圖挖掘一個定義的前綴,並將其用作xsi:type屬性中的值xsi:type =「a:foo」)的元素 - 並且不會由上面的代碼返回。 –

+0

換句話說,如何獲得已定義的命名空間前綴(而不是被使用)? –

+0

建議的解決方案順式啓動,如我所說。你有沒有創建另一個問題,或者我應該補充嗎? –

相關問題