【问题标题】:XML Deserialization and Loose Array ItemsXML 反序列化和松散数组项
【发布时间】:2009-02-10 22:12:24
【问题描述】:

所以我正在处理一些我认为很可能格式不正确的 XML 文件,并且我试图弄清楚如何以及是否可以使用 XmlSerializer 将此 XML 反序列化为逻辑业务对象。假设我有以下 XML 文件:

<Root>
   <ArrayType1 Name="Bob"/>
   <ArrayType1 Name="Jim"/>
   <ArrayType2 Name="Frank">
      <SubItem Value="4"/>
   </ArrayType2>
   <ArrayType2 Name="Jimbo">
      <SubItem Value="2"/>
   </ArrayType2>
</Root>

现在我想创建一个具有这三种类型 Root、ArrayType1 和 ArrayType2 的类,但我想在 Root 中获取两个列表,一个包含 ArrayType1 项的集合,一个包含 ArrayType1 项的集合ArrayType2 项,但似乎这些项需要有某种根,例如,我知道如何反序列化以下内容就好了:

<Root>
   <ArrayType1Collection>
      <ArrayType1 Name="Bob"/>
      <ArrayType1 Name="Jim"/>
   </ArrayType1Collection>
   <ArrayType2Collection>
      <ArrayType2 Name="Frank">
         <SubItem Value="4"/>
      </ArrayType2>
      <ArrayType2 Name="Jimbo">
         <SubItem Value="2"/>
      </ArrayType2>
   </ArrayType2Collection>
</Root>

但是如果没有 ArrayType# 元素周围的父 ArrayType#Collection 元素,我将如何反序列化呢?

XML 序列化器会允许这样做吗?

【问题讨论】:

    标签: c# arrays xml-serialization


    【解决方案1】:

    不就是这样吗:

    [Serializable]
    public class Root {
        [XmlElement("ArrayType1")]
        public List<ArrayType1> ArrayType1 {get;set;}
    
        [XmlElement("ArrayType2")]
        public List<ArrayType2> ArrayType2 {get;set;}
    }
    

    ?

    或者,只需将 xml 放入文件(“foo.xml”)并使用:

    xsd foo.xml
    xsd foo.xsd /classes
    

    并查看生成的 foo.cs

    【讨论】:

    • 再次过于复杂...谢谢。 :)
    • 这里的 XmlElements 是否应该读取,例如 ArrayType1ArrayType1Collection
    • 当我查看 OP 的第二个 XML sn-p 时,我看到一个名为 ArrayType1CollectionXmlElement,它本质上是一组 XmlElements,类型为 ArrayType1。当我查看您的代码 sn-p 时,我看到一个名为 ArrayType1XmlElement,它本质上是一组 ArrayType1 类型的 objects。我希望XmlElement 的名称为ArrayType1Collection(因为这是包含ArrayType1 类型的子元素的名称)。
    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    相关资源
    最近更新 更多