Десериализация нескольких XML-элементов с одинаковым именем через класс XmlSerializer в C#
у меня есть 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 ответов
не хочешь XmlArrayItem
. Вы хотите, чтобы массив ints был сериализован без родительского элемента, что означает, что вы должны украсить сам массив 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>
вам просто нужно сделать следующее, чтобы это сработало:
[XmlElement]
public int[] ScheduledDay { get; set; }
добавляя этот атрибут, каждый раз, когда элемент ScheduledDay виден сериализатором (de), он будет знать, чтобы добавить его в этот массив.