Search code examples
c#xmldeserialization

XML string not getting serialized properly to C# object


I have the following C# classes.

[XmlRoot(Namespace = "http://sameplens.com", ElementName = "dataElement")]
public class SampleClass
{
    [XmlElement(ElementName = "inner")]
    public List<SampleInnerClass> Inner { get; set; }

    [XmlElement(ElementName = "outerfield1")]
    public string OuterField1 { get; set; }

    [XmlElement(ElementName = "outerfield2")]
    public string OuterField2 { get; set; }
}

and

public class SampleInnerClass
{
    [XmlElement(ElementName = "innerfield1")]
    public string InnerField1 { get; set; }

    [XmlElement(ElementName = "innerfield2")]
    public string InnerField2 { get; set; }
}

The XML I'm trying to deserialize looks like this:

<ns2:dataElement xmlns:ns2="http://sameplens.com">
  <inner>
    <innerfield1>a1</innerfield1>
    <innerfield2>a2</innerfield2>
  </inner>
  <inner>
    <innerfield1>a3</innerfield1>
    <innerfield2>a4</innerfield2>
  </inner>
  <outerfield1>a</outerfield1>
  <outerfield2>b</outerfield2>
</ns2:dataElement>

I have created a generic method for extracting the data:

public T ExtractDataFromResponse<T>(string responseString)
{
    T responseObject;
    XmlSerializer responseSerializer = new XmlSerializer(typeof(T));

    using (StringReader responseReader = new StringReader(responseString))
    {   
        responseObject = (T)responseSerializer.Deserialize(responseReader);
        return responseObject;
    }
}

What I am getting back is a SampleClass type obejct with Inner type List empty, and fields OuterField1 and OuterField2 null. What am I doing wrong? Thank you in advance!


Solution

  • The following code get everything. I child automatically inherits the parent namespace unless otherwise specified. ns2 is only on the root and not on any children.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Serialization;
    
    namespace ConsoleApp10
    {
        class Program
        {
            const string FILENAME = @"c:\temp\test.xml";
            static void Main(string[] args)
            {
                XmlReader reader = XmlReader.Create(FILENAME);
    
                XmlSerializer serializer = new XmlSerializer(typeof(SampleClass));
    
                SampleClass sample = (SampleClass)serializer.Deserialize(reader);
            }
     
    
    
        }
        [XmlRoot(Namespace = "http://sameplens.com", ElementName = "dataElement")]
        public class SampleClass
        {
            [XmlElement(ElementName = "inner",Namespace = "")]
            public List<SampleInnerClass> Inner { get; set; }
    
            [XmlElement(ElementName = "outerfield1", Namespace = "")]
            public string OuterField1 { get; set; }
    
            [XmlElement(ElementName = "outerfield2", Namespace = "")]
            public string OuterField2 { get; set; }
        }
        public class SampleInnerClass
        {
            [XmlElement(ElementName = "innerfield1")]
            public string InnerField1 { get; set; }
    
            [XmlElement(ElementName = "innerfield2")]
            public string InnerField2 { get; set; }
        }
    }