2012-08-22 89 views
1

使用定義在http://www.w3schools.com/xpath/xpath_examples.asp的XPath方法 我可以輕鬆訪問XML字符串中的元素。但是這不適用於SOAP數據包,比如我下面的內容。我得到的錯誤是「SOAP-ENV未聲明」。使用XPath字符串解析SOAP消息

我的XPath字符串

/SOAP-ENV:Envelope/SOAP-ENV:Body/SpRc:ScanPortsResponse/SpRc:PortDescs[1]

XML/SOAP消息

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SpRc="urn:SpRc"> 
    <SOAP-ENV:Body> 
     <SpRc:ScanPortsResponse> 
      <SpRc:PortDescs> 
       <SpRc:item> 
        <SpRc:Serial>4215002032</SpRc:Serial> 
        <SpRc:TypeNumber>215</SpRc:TypeNumber> 
        <SpRc:Ip>4M5rAQ==</SpRc:Ip> 
        <SpRc:Mac>GDAAURgk</SpRc:Mac> 
        <SpRc:FirmwareVersion>1</SpRc:FirmwareVersion> 
        <SpRc:FirmwareVariant>0</SpRc:FirmwareVariant> 
        <SpRc:Port>1</SpRc:Port> 
        <SpRc:OutputType>28738</SpRc:OutputType> 
        <SpRc:Capabilities>97</SpRc:Capabilities> 
        <SpRc:InUse>1</SpRc:InUse> 
       </SpRc:item> 
      </SpRc:PortDescs> 
      <SpRc:SpRcResult>0</SpRc:SpRcResult> 
     </SpRc:ScanPortsResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

回答

2

這似乎是與XML命名空間的問題。您的XPath解析器似乎是可以識別名稱空間的。在解析XML之前,嘗試在解析器中設置SOAP名稱空間。

+0

我實際上在SOAP消息的根標記中定義了命名空間,我相信這就是XPATH找不到它的原因。它可以工作,如果我去一個級別。 –

1

Abhinav Sarkar上面的答案是正確的,但我想詳細說明。您需要使用的

/SOAP-ENV:Body/SpRc:ScanPortsResponse/SpRc:PortDescs[1] 

代替

/SOAP-ENV:Envelope/SOAP-ENV:Body/SpRc:ScanPortsResponse/SpRc:PortDescs[1] 

東陽XPATH看起來向後的命名空間,如果父標籤是在命名空間定義那麼它將無法正常工作。