2010-08-09 165 views
3

我有一個XML SOAP結果:XML + XPATH:使用默認命名空間的任何方式?

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <CreateCIInStockResponse xmlns="http://somenamespace.com/"> 
     <CreateCIInStockResult> 
     <Status>OK</Status> 
     <Data>SOMERESULT</Data> 
     </CreateCIInStockResult> 
    </CreateCIInStockResponse> 
    </soap:Body> 
</soap:Envelope> 

正如你所看到的,在CreateCIInStockResponse定義的命名空間使用默認的命名空間 - 沒有定義的前綴。

我能得到這兩個狀態數據如果我們使用

/soap:Envelope/soap:Body/node()/node()/node()/text() 

我說得對,那也沒辦法 - 使用XPath - 直接訪問「數據」的內容?

我的問題是,我既不能修改對web服務的調用,也不能修改從web服務返回的結果。我所能做的就是使用XPath來獲取數據。

有什麼建議嗎?

+0

什麼是您使用的基礎XML解析器? Vtd-xml實際上允許你訪問默認的命名空間,因爲它沒有前綴。 – 2010-08-09 22:16:56

+0

我自己不使用解析器。它是一個完整的,編譯好的應用程序(如黑匣子),它將XML用於一邊,XPATH用於另一邊它執行某些操作,獲取值並繼續使用該值。 – BlaM 2010-08-11 13:07:41

回答

8

分配http://somenamespace.com/一個命名空間前綴,說 「高清」,並用它在你的XPath表達式:

/SOAP:信封/ SOAP:身體/ DEF:CreateCIInStockResponse/DEF:數據

如何分配前綴將取決於您的XPath處理器。

更新:替代做法,如果分配的前綴是不是一種選擇:

/soap:Envelope/soap:Body/*[local-name()='CreateCIInStockResponse']/*[local-name()='Data'] 

要絕對確保你訪問你所期望的元素,您可以添加命名空間URI()=' http://somenamespace.com/'。

+0

我的問題是,我無法使用XPath訪問應用程序的代碼。我只有一個輸入框,可以輸入我的XPath字符串。但是你的答案正是我害怕得到的答案... *嘆息* – BlaM 2010-08-09 12:06:29

+0

好的答案,並且編輯得很好! +1 – 2010-08-09 13:55:23

+0

太棒了,那個作品非常漂亮! – BlaM 2010-08-09 14:35:28

相關問題