【问题标题】:xml serialization arrays C#xml序列化数组C#
【发布时间】:2011-07-29 17:15:36
【问题描述】:

我遇到了一个让我很糟糕的事情

<items>
<name ="something 1" />

<subitems>
<name ="sub something1" />
<item name="item 1" />
<item name="item 2" />
<item name="item 3" />
<someOtherTag name="Come On Really">
</subitems>

</items>

我正在序列化一个对象,我想出了最后一个让我陷入循环的结构。我真的很想在子项目上使用 xmlarray 属性,但额外的名称标签让我失望。有任何想法吗?我正在寻找专门的 C# 反序列化。

【问题讨论】:

  • 您可以为您的问题发布一个有效的 XML 吗? 无效(格式错误)。

标签: c# xml arrays serialization


【解决方案1】:

由于您发布的 XML 无效,我们需要先使其有效。不能解析就不能反序列化。如果此“XML”来自外部来源,他们需要首先为您提供语法上有效的 XML 文档。如果“XML”是由你控制的东西生成的,你需要修复它。

这里有几种类似的标记形式,它们在语法上是有效的 XML,并且可以通过 XML 序列化轻松序列化,只需使用简单的属性:

  • 选项 1:

    <items name ="something 1" >
      <subitems name ="sub something1" >
        <item name="item 1" />
        <item name="item 2" />
        <item name="item 3" />
        <someOtherTag name="Come On Really" />
      </subitems>
    </items>
    

    对于这个选项,这里有一个一个类,它将序列化/反序列化上述标记(应该注意,正如他们在 Perl 世界中所说的那样,“TMTOWTDI”(不止一个方法):

      [XmlRoot( "items" )]
      public class Widget
      {
    
        [XmlAttribute("name")]
        public string Name { get ; set ; }
    
        [XmlElement( "subitems" )]
        public SubWidget SubItems { get ; set ; } 
    
        public class SubWidget
        {
    
          [XmlAttribute("name")]
          public string Name { get ; set ; }
    
          [XmlElement("item")]
          public Element[] Item { get ; set ; }
    
          [XmlElement("someOtherTag")]
          public Element SomeOtherTag { get ; set ; }
    
          public class Element
          {
    
            [XmlAttribute("name")]
            public string Name { get ; set ; }
    
          }
    
        }
    
      }
    
  • 选项 2:

    <items>
      <name>something 1</name>
      <subitems>
        <name>sub something1</name>
        <item name="item 1" />
        <item name="item 2" />
        <item name="item 3" />
        <someOtherTag name="Come On Really" />
      </subitems>
    </items>
    

    同样,一个类 将序列化/反序列化此标记实际上与第一种情况相同。我们所做的只是将两个属性从XmlAttribute 更改为XmlElement,因此:

    [XmlRoot( "items" )]
    public class Widget
    {
    
      [XmlElement("name")] // was XmlAttribute
      public string Name { get ; set ; }
    
      [XmlElement( "subitems" )]
      public SubWidget SubItems { get ; set ; } 
    
      public class  SubWidget
      {
    
        [XmlElement("name")] // was XmlAttribute
        public string Name { get ; set ; }
    
        [XmlElement("item")]
        public Element[] Item { get ; set ; }
    
        [XmlElement("someOtherTag")]
        public Element SomeOtherTag { get ; set ; }
    
        public class Element
        {
    
          [XmlAttribute("name")]
          public string Name { get ; set ; }
        }
    
      }
    
    }
    

【讨论】:

    【解决方案2】:

    这不是真正有效的 xml 开始。

    您应该在重复的一系列项目周围放置一个 标签。

    另外,尝试使用内置的 .Net 序列化器:

    The easiest way to populate a collection from XML file in .NET

    【讨论】:

    猜你喜欢
    • 2010-09-12
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    相关资源
    最近更新 更多