2012-10-10 45 views
2

我從網絡服務的SOAP信封的迴應如下:提取XML在C#

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<s:Body> 
    <ProcessTranResponse xmlns="http://www.polaris.co.uk/XRTEService/2009/03/"> 
    <ProcessTranResult xmlns:a="http://schemas.datacontract.org/2004/07/XRTEService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <a:PrintFormFileNameContents i:nil="true"/> 
     <a:ResponseXML>response_message</a:ResponseXML> 
    </ProcessTranResult> 
    </ProcessTranResponse> 
</s:Body> 

我想response_message給一個字符串變量。我試着做

XDocument doc = XDocument.Parse(Response); 
XNamespace xmlnsa = "http://schemas.datacontract.org/2004/07/XRTEService"; 
var ResponseXML = doc.Descendants(xmlnsa + "ResponseXML"); 

當我使用的手錶我看到我的ResponseXML -> Results View[0] -> Valueresponse_message,但我無法弄清楚什麼是下一個步驟,從C#得到價值。

回答

2

XContainer.Descendants返回元素的集合。那麼你應該嘗試這樣的事:

foreach (XElement el in ResponseXML) 
{ 
    Console.WriteLine(el.Value); 
} 

或者你也可以做這樣的事情,如果你知道有永遠只有一個反應:

XDocument doc = XDocument.Parse(Response); 

XNamespace xmlnsa = "http://schemas.datacontract.org/2004/07/XRTEService"; 

XElement ResponseXML = (from xml in XMLDoc.Descendants(xmlnsa + "ResponseXML") 
         select xml).FirstOrDefault(); 

string ResponseAsString = ResponseXML.Value; 
+0

另外doc.Descendants(xmlnsa +「ResponseXML」)。First()。Value ;使用Linq工作。謝謝! – user1734523

+0

不客氣!請注意,如果後代列表爲空,則'.First()'可能會拋出異常...... –

+0

如果FirstOrDefault返回null,則''ResponseXML.Value'將引發異常。 –

1

您可以使用多個解決方案來滿足你的目的,而你可能想引入xml內容的結構或不。

靜態態度

你可以簡單地使用:

doc.LastChild.FirstChild.FirstChild.LastChild.InnerText; 

讀取XML結構

XmlDocument _doc = new XmlDocument(); 
doc.LoadXml(_stream.ReadToEnd()); 

然後像這樣的東西找到所需數據

您可以編寫一些額外的代碼行來引入命名空間和其他xml內容來查找/映射可用數據,通過看一下extracting-data-from-a-complex-xml-with-linq