Десериализовать несколько элементов XML с одинаковыми именами через класс XmlSerializer в C # - PullRequest
11 голосов
/ 10 марта 2011

У меня есть XML в виде

 <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>

Мне нужно десериализовать его, изменить его содержимое и сохранить обратно. Я столкнулся с проблемой при чтении элемента ScheduledDay. Мой класс как

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

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

Теперь, когда я загружаю содержимое XML, которое имеет правильные значения для ScheduledDay, мой массив классов по-прежнему равен NULL.

Я не могу изменить содержимое / формат XML, поскольку это устаревший код. Я не хочу использовать XDocument для чтения значения, поскольку это большой XML, и мне нужно снова его сериализовать.

Я много искал без посторонней помощи. Любые идеи будут высоко оценены.

Спасибо ...

Ответы [ 3 ]

18 голосов
/ 10 марта 2011

Вы не хотите XmlArrayItem. Вы хотите, чтобы массив целых чисел был сериализован без родительского элемента, что означает, что вы должны декорировать сам массив с помощью XmlElement. Поскольку у вас есть определенный заказ, вы можете использовать значение Order в атрибуте XmlElement. Вот класс, модифицированный соответственно:

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;
}

Вот сгенерированный 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>
15 голосов
/ 10 марта 2011

Украсьте вашу недвижимость:

[XmlElement("ScheduledDay")]
public int[] ScheduledDay { get; set; }
2 голосов
/ 10 марта 2011

Вы должны просто сделать следующее, чтобы это работало:

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

При добавлении этого атрибута каждый раз, когда элемент ScheduledDay видит (de) сериализатор, он узнает, добавит ли его в этот массив.

...