Search code examples
c#asp.netdynamicxml-deserialization

Deserialize xml into class having string values in xml


Let me explain, there is a database table which has 1 XML column named audits and other common types of column.

so is this possible to deserialize below XML into class.

<?xml version="1.0"?>
<entity type="Order">
    <id type="System.Int64">146</id>
    <ordernumber type="System.String">OD555</ordernumber>
    <audits type='System.String'>
      <audit>
        <item>
          <create timestamp='2017-07-19 10:02:13' userid='23' />
        </item>
        <invoice>
          <create timestamp='2017-07-19 10:03:37' userid='45' />
        </invoice>
      </audit>
    </audits>
</entity>

Class:

public class Order 
{
    public long id { get; set; }
    public string ordernumber { get; set; }
    public string audits { get; set; }
}   

Solution

  • Modifying your model with the attributes XmlType and XmlAnyElement (requires XmlElement as type)

    [XmlType("entity")]
    public class Order
    {
        public long id { get; set; }
        public string ordernumber { get; set; }
        [XmlAnyElement]
        public XmlElement audits { get; set; }
    }
    

    allows to deserialize the complete XML string like

    using (MemoryStream stream = new MemoryStream())
    using (StreamWriter writer = new StreamWriter(stream))
    {
        writer.Write(xmlString);
        writer.Flush();
        stream.Position = 0;
    
        XmlSerializer serializer = new XmlSerializer(typeof(Order));
        Order o = (Order)serializer.Deserialize(stream);
    }
    

    Now you are able to get the audits as string like

    string auditsString = o.audits.InnerXml;
    

    You can also add a property to your model to simplify the access:

    public string auditsString
    {
        get
        {
            return audits.InnerXml;
        }
    }