2013-02-27 92 views
0

我有這個SOAP響應,但我的代碼沒有讀取GetLatestReadingByMeterNoResult子項。「手動」解析SOAP響應

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Header/> 
    <soapenv:Body> 
    <GetLatestReadingByMeterNoResponse xmlns="http://www.multispeak.org/Version_3.0"> 
    <GetLatestReadingByMeterNoResult objectID="112199498" utility="xxxxx"> 
     <meterNo>112199498</meterNo> 
     <deviceID>112199498</deviceID> 
     <readingDate>2013-02-27T17:00:00.000Z</readingDate> 
     <posKWh>8406</posKWh> 
     <kW>15.508</kW> 
     <kWDateTime>2013-02-27T17:00:00.000Z</kWDateTime> 
     </GetLatestReadingByMeterNoResult> 
    </GetLatestReadingByMeterNoResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

代碼:

XmlDocument resultXml = new XmlDocument(); 
XmlNamespaceManager mgr = new XmlNamespaceManager(resultXml.NameTable); 
mgr.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/"); 
mgr.AddNamespace("", "http://www.multispeak.org/Version_3.0"); 
resultXml.LoadXml(soapResult); 
XmlNodeList nodeList = resultXml.SelectNodes("//GetLatestReadingByMeterNoResult", mgr); 

節點列表返回沒有節點

+0

您是否驗證過您的預期響應是從服務器返回的?你可以通過像SoapUI這樣的程序來做到這一點。 – TomJ 2013-02-27 19:43:50

+0

肥皂響應是從流中返回的原始字符串。 – Fonzy 2013-02-27 19:47:20

+1

你爲什麼不簡單使用「添加服務參考」?有沒有直接操縱XML直接用於SOAP的理由。 – 2013-02-27 19:51:17

回答

5

試試這個:處理默認命名空間

mgr.AddNamespace("multi", "http://www.multispeak.org/Version_3.0"); 
resultXml.LoadXml(soapResult); 
XmlNodeList nodeList = resultXml.SelectNodes("//multi:GetLatestReadingByMeterNoResult", mgr); 

即使,您需要使用XPATH時使用的前綴在代碼中。

+0

感謝它的工作。 – Fonzy 2013-02-27 19:56:30

+0

很高興聽到它。但爲什麼不使用「添加服務引用」並完成所有這些XML? – 2013-02-27 19:58:12