C#中通过XmlSerializer类反序列化多个同名XML元素
Posted
技术标签:
【中文标题】C#中通过XmlSerializer类反序列化多个同名XML元素【英文标题】:Deserialize multiple XML elements with the same name through XmlSerializer class in C# 【发布时间】:2011-07-12 16:59:14 【问题描述】:我有一个 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;
.....
现在,当我加载具有正确 ScheduledDay 值的 XML 内容时,我的类数组仍然为 NULL。
我无法修改 XML 的内容/格式,因为它是遗留代码。我不想使用 XDocument 来读取值,因为它是一个很大的 XML,我需要再次序列化它。
我在没有任何帮助的情况下进行了很多搜索。任何想法都将受到高度赞赏。
谢谢...
【问题讨论】:
【参考方案1】:您只需要执行以下操作即可:
[XmlElement]
public int[] ScheduledDay get; set;
通过添加此属性,每次(反)序列化程序看到 ScheduledDay 元素时,它都会知道将其添加到此数组中。
【讨论】:
不——那是行不通的。XmlArrayItem
告诉序列化程序将数组元素作为子元素放入表示数组的父元素中。原贴的要求是数组没有父元素。【参考方案2】:
装饰您的财产:
[XmlElement("ScheduledDay")]
public int[] ScheduledDay get; set;
【讨论】:
【参考方案3】:你不想要XmlArrayItem
。您希望在没有父元素的情况下对 int 数组进行序列化,这意味着您应该使用 XmlElement
装饰数组本身。因为您有一个特定的顺序,所以您需要在 XmlElement 属性上使用 Order
值。这是类,相应修改:
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>
【讨论】:
以上是关于C#中通过XmlSerializer类反序列化多个同名XML元素的主要内容,如果未能解决你的问题,请参考以下文章
c# XmlSerializer 反序列化器缺少默认命名空间
无法使用 c# xmlserializer 反序列化以前序列化的 XML
C# XmlSerializer 用不同的命名空间序列化同一个类