【问题标题】:Deserialize multiple XML elements with the same name through XmlSerializer class in C#C#中通过XmlSerializer类反序列化多个同名XML元素
【发布时间】: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,我需要再次序列化它。

我在没有任何帮助的情况下进行了很多搜索。任何想法都将受到高度赞赏。

谢谢...

【问题讨论】:

    标签: c# xml xml-serialization xml-deserialization


    【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        相关资源
        最近更新 更多