Gotts
Gotts

Reputation: 2454

Deserialize soap response with multiple namespaces

I am having a very hard time trying to deserialize the soap response below. I assume its because of the multiple namespaces or maybe because of the complex type (Serialization Array)

Soapformatter throws an Object reference exception and other more manual deserializations are returning an empty object. At this point I can only assume that I am not tagging my object correctly. What is the correct way to build out the BatchResponse object below so that it can deserialize from this response?

    <?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
   <s:Header>
      <a:Action s:mustUnderstand="1">https://example.com/operations/fetch/BatchResponse</a:Action>
   </s:Header>
   <s:Body>
      <BatchResponse xmlns="https://example.com/operations">
         <BatchResult xmlns:b="https://example.com/responses" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <b:FailureMessages xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/Arrays" i:nil="true" />
            <b:FailureType i:nil="true" />
            <b:ProcessedSuccessfully>true</b:ProcessedSuccessfully>
            <b:SessionId>1961810</b:SessionId>
            <b:TotalPages>38</b:TotalPages>
         </BatchResult>
      </BatchResponse>
   </s:Body>
</s:Envelope>

Also assuming Soapformatter continues to throw exceptions - what is the correct way to "xpath" to the BatchResponse object so that I can extract and deserialize?

Thanks

Upvotes: 0

Views: 2078

Answers (2)

jdweng
jdweng

Reputation: 34421

Try following :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication131
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);

            XmlSerializer serializer = new XmlSerializer(typeof(Envelope));
            Envelope envelope = (Envelope)serializer.Deserialize(reader);
        }
    }
    [XmlRoot(ElementName = "Envelope", Namespace = "http://www.w3.org/2003/05/soap-envelope")]
    public class Envelope
    {
        [XmlElement(ElementName = "Header", Namespace = "http://www.w3.org/2003/05/soap-envelope")]
        public Header header { get; set; }

        [XmlElement(ElementName = "Body", Namespace = "http://www.w3.org/2003/05/soap-envelope")]
        public Body body { get; set; }
    }
    [XmlRoot(ElementName = "Header", Namespace = "http://www.w3.org/2003/05/soap-envelope")]
    public class Header
    {
        [XmlElement(ElementName = "Action", Namespace = "http://www.w3.org/2005/08/addressing")]
        public Action action { get; set; }
    }
    [XmlRoot(ElementName = "Action", Namespace = "http://www.w3.org/2005/08/addressing")]
    public class Action
    {
        [XmlAttribute(AttributeName = "mustUnderstand", Namespace = "http://www.w3.org/2003/05/soap-envelope")]
        public int mustUnderstand { get; set;}
        [XmlText]
        public string value { get;set;}
    }
    [XmlRoot(ElementName = "Body", Namespace = "")]
    public class Body
    {
        [XmlElement(ElementName = "BatchResponse", Namespace = "https://example.com/operations")]
        public BatchResponse batchResponse { get; set; }
    }
    [XmlRoot(ElementName = "BatchResponse", Namespace = "https://example.com/operations")]
    public class BatchResponse
    {
        [XmlElement(ElementName = "BatchResult", Namespace = "https://example.com/operations")]
        public BatchResult batchResult { get; set; }
    }
    [XmlRoot(ElementName = "BatchResult", Namespace = "https://example.com/operations")]
    public class BatchResult
    {
        [XmlElement(ElementName = "FailureMessages", Namespace = "https://example.com/responses")]
        public string failureMessages { get; set; }

        [XmlElement(ElementName = "FailureType", Namespace = "https://example.com/responses")]
        public string failureType { get; set; }

        [XmlElement(ElementName = "ProcessedSuccessfully", Namespace = "https://example.com/responses")]
        public Boolean  processedSuccessfully { get; set; }

        [XmlElement(ElementName = "SessionId", Namespace = "https://example.com/responses")]
        public string sessionId { get; set; }

        [XmlElement(ElementName = "TotalPages", Namespace = "https://example.com/responses")]
        public int totalPages { get; set; }

    }
}

Upvotes: 2

Ed Bangga
Ed Bangga

Reputation: 13016

you can use local-name() to ignore the namespace in xpath

//*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='BatchResponse']

Upvotes: 0

Related Questions