2013-12-09 44 views
0

可以說我有這樣的UPnP的SOAP響應:匹配命名空間下的唯一XML節點,不知道NS前綴

<?xml version="1.0"?> 
<m:head xmlns:m="dont_care_about_any_node_in_this_namespace"> 
    <m:body xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1"> 
    <u:SomeFunctionResponse> 
     <u:OutParamName>Some Text</u:OutParamName> 
    </u:SomeFunctionResponse> 
    </m:body> 
</m:head> 

我想選擇有u命名空間前綴的所有節點,但:

  • u命名空間中的節點名稱可能不同。
  • 我不知道命名空間前綴是否爲u,它可以是任何東西。
  • 我知道的唯一的事情是我用來調用的動作,在這種情況下urn:schemas-upnp-org:service:WANPPPConnection:1

如何選擇只u節點的服務?喜歡的東西:

//urn:schemas-upnp-org:service:WANPPPConnection:1/* 

我已經看到篇關於實施NamespaceContext但我就是不明白,做什麼或者我如何使用它......那些examples通常最終會在某個時候硬編碼的前綴,使他們對我來說顯得很愚蠢。此外,該接口的實現通常看起來像很多代碼,看起來很簡單...

+0

是否檢查這裏:http://stackoverflow.com/questions/529556/xpath-find-elements- by-attribute-namespace? – Matthias

+0

感謝Matthias。問了2分鐘後,我回答了我自己的問題! (典型的...)我會發布我的發現... – Jobbo

回答

1

我問了幾分鐘後,我實際上回答了我自己的問題。我需要把我的DocumentBuilderFactory是名稱空間感知的:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
Document doc = dbf.newDocumentBuilder().parse("myxml.xml"); 
XPath xp = XPathFactory.newInstance().newXPath(); 
XPathExpression xpe = xp.compile("//*[namespace-uri()='urn:schemas-upnp-org:service:WANPPPConnection:1']"); 
NodeList nl = (NodeList) xpe.evaluate(doc, XPathConstants.NODESET); 
for(int i = 0; i < nl.getLength(); i++){ 
    Element e = (Element) nl.item(i); 
    System.out.println(e.getNodeName()); 
} 

輸出:

u:SomeFunctionResponse 
u:OutParamName 
+0

事實上,在第一個地方使用'javax.xml.soap'可能會更好...... – Jobbo

相關問題