Bill Lee
Bill Lee

Reputation: 61

Using LINQ to XML to Parse a SOAP message

I am getting up to speed in Linq to XML in C# and attempting to parse the following message and don't seem to be making much progress. Here is the soap message I am not sure if I perhaps I need to use a namespace. Here is the SOAP message I am trying to format. Any help would be greatly appreciated. I am attempting to extract the values. Thanks.

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
  <Lookup xmlns="http://ASR-RT/">
   <objIn>
    <transactionHeaderData>
     <intWebsiteId>1000</intWebsiteId>
     <strVendorData>test</strVendorData>
     <strVendorId>I07</strVendorId>
    </transactionHeaderData>
    <intCCN>17090769</intCCN>
    <strSurveyResponseFlag>Y</strSurveyResponseFlag>
   </objIn>
  </CCNLookup>
 </soap:Body>
</soap:Envelope>

Upvotes: 6

Views: 8612

Answers (3)

Pato
Pato

Reputation: 679

You can get your XML into an XElement an then just do:

rsp.Descendants("Lookup").ToList();

Or

rsp.Descendants("objIn").ToList();

I think this is the best way to do it. I think that XElement is the best choice.

Upvotes: 0

Cameron Jordan
Cameron Jordan

Reputation: 759

If this is about interacting with a SOAP service please use Add Service Reference or wsdl.exe.

If this is just about parsing the XML, assuming you've got the SOAP response into an XDocument named soapDocument:

XNamespace ns = "http://ASR-RT/";
var objIns = 
    from objIn in soapDocument.Descendants(ns + "objIn")
    let header = objIn.Element(ns + "transactionHeaderData")
    select new
    {
        WebsiteId = (int) header.Element(ns + "intWebsiteId"),
        VendorData = header.Element(ns + "strVendorData").Value,
        VendorId = header.Element(ns + "strVendorId").Value,
        CCN = (int) objIn.Element(ns + "intCCN"),
        SurveyResponse = objIn.Element(ns + "strSurveyResponseFlag").Value,
    };

That will give you an IEnumerable of anonymous types you deal with as fully strongly typed objects within that method.

Upvotes: 9

dthorpe
dthorpe

Reputation: 36082

Use Linq's XDocument to load the XML text by calling XDocument.Load() or similar. Then you can walk through the tree of elements off the xdoc's Root, using functions like

foreach (var x in xdoc.Elements("Lookup"))
{...}

Upvotes: 0

Related Questions