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# XML序列化和反序列化(XmlSerializer)

C# XmlSerializer 用不同的命名空间序列化同一个类

C# Xmlserializer 将列表反序列化为 0 而不是 null

C# XMLSerializer 将错误的类型反序列化为 List