user1734523
user1734523

Reputation: 35

Extract XML from SOAP envelope in c#

I have a response from web service in SOAP envelope as follows:

<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>

And I want to get response_message to a string variable. I tried doing

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

And when I use watch I see in ResponseXML -> Results View[0] -> Value my response_message, but I can't figure out what is the next step to get to Value from C#.

Upvotes: 3

Views: 5641

Answers (2)

Amirhossein Mehrvarzi
Amirhossein Mehrvarzi

Reputation: 18954

You can employ several solutions to meet your purpose while you may wanna introduce the structure of xml content or not.

Static attitude

You can simply use this:

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

Then find the desired data with something like this:

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

Read xml structure

You can write some additional lines of code to introduce namespaces and other xml contents to find/map the available data, by taking a look at extracting-data-from-a-complex-xml-with-linq

Upvotes: 1

Yannick Blondeau
Yannick Blondeau

Reputation: 9621

XContainer.Descendants returns a collection of elements. You should then try something like this:

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

Or you can do something like this if you know that there is always only one response:

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;

Upvotes: 2

Related Questions