Deserialize multiple XML elements with the same name through XmlSerializer class in C#

shobhit picture shobhit · Mar 10, 2011 · Viewed 17.8k times · Source

I have an XML in the form

 <BackupSchedule>
    <AggressiveMode>0</AggressiveMode>  
    <ScheduleType>0</ScheduleType>  
    <ScheduledDay>0</ScheduledDay>  
    <ScheduledDay>1</ScheduledDay>  
    <ScheduledDay>0</ScheduledDay>  
    <ScheduledDay>0</ScheduledDay>  
    <ScheduledDay>0</ScheduledDay>  
    <ScheduledDay>0</ScheduledDay>  
    <ScheduledDay>0</ScheduledDay>  
    <WindowStart>480</WindowStart>  
    <WindowEnd>1020</WindowEnd>  
    <ScheduleInterval>0</ScheduleInterval>  
  </BackupSchedule>

I need to deserialize it, change its contents and than save it back. I am facing problem in reading ScheduledDay element. My class is like

public class BackupScheduleSettings  
{  
        public BackupScheduleSettings()  
        {   
            ScheduledDay = new int[7];  
        }  

        .....
        public int[] ScheduledDay { get; set; }
        .....  
 }

Now when I load XML content which has right values for ScheduledDay, my class array is still NULL.

I can't modify the content/format of XML since it is legacy code. I don't want to use XDocument to read the value since it is a large XML and I need to serialize it again.

I have searched a lot without any help. Any ideas will be highly appreciated.

Thanks...

Answer

Cheeso picture Cheeso · Mar 10, 2011

You don't want XmlArrayItem. You want the array of ints to be serialized without a parent element, which means you should decorate the array itself with XmlElement. Because you have a particular order, you will want to use the Order value on the XmlElement attribute. Here's the class, modified accordingly:

public class BackupScheduleSettings
{
    public BackupScheduleSettings()
    {
        ScheduledDay = new int[7];
    }

    [XmlElement(Order=1)]
    public int AggressiveMode;
    [XmlElement(Order=2)]
    public int ScheduleType;
    //[XmlArrayItem("ArrayWrapper")]
    [XmlElement(Order=3)]
    public int[] ScheduledDay { get; set; }
    [XmlElement(Order=4)]
    public int WindowStart;
    [XmlElement(Order=5)]
    public int WindowEnd;
    [XmlElement(Order=6)]
    public int ScheduleInterval;
}

Here's the generated xML:

<BackupScheduleSettings>
  <AggressiveMode>0</AggressiveMode>
  <ScheduleType>0</ScheduleType>
  <ScheduledDay>0</ScheduledDay>
  <ScheduledDay>0</ScheduledDay>
  <ScheduledDay>0</ScheduledDay>
  <ScheduledDay>0</ScheduledDay>
  <ScheduledDay>0</ScheduledDay>
  <ScheduledDay>0</ScheduledDay>
  <ScheduledDay>0</ScheduledDay>
  <WindowStart>0</WindowStart>
  <WindowEnd>0</WindowEnd>
  <ScheduleInterval>0</ScheduleInterval>
</BackupScheduleSettings>