【问题标题】:How to Deserialize a xml file's listed items which is present within another listed items如何反序列化另一个列出的项目中存在的 xml 文件的列出项目
【发布时间】:2014-04-04 18:18:11
【问题描述】:

我有一个自动生成的 xml 文件,格式如下。

<?xml version="1.0"?>
<School>
  <Classes numberOfFields="5">
    <Class name="10" dataType="double">
        <Section value="A"/>
        <Section value="B"/>
        <Section value="C"/>
    </Class>
    <Class dataType="double"/>
    <Class dataType="double"/>
    <Class dataType="double"/>
    <Class dataType="double"/>
  </Classes>
</School>

我使用“XmlDeserializer”反序列化如下

School schoolResult = (School)xmlSerializer.Deserialize(stream);

XmlRootElement 在“Classes”标签下包含一个“Class”集合,并且每个“Class”都将包含“Section”集合。

在 C# 中,我已经声明这样将“类”反序列化为类列表。

[XmlArray("Classes")]
[XmlArrayItem("Class", typeof(Class))]
public List<Class> Classes {};

现在为了进一步将 Class 反序列化为部分列表,我添加了如下代码。

[XmlArray("Class")]
[XmlArrayItem(ElementName="Section")]
public List<Section> ClassSections {};

我的问题是我无法正确获取部分列表值。因为我在第一部分中将“类”作为类名,在第二部分中我提到了与数组元素相同的“类”。那么任何人都可以告诉我如何使用“XmlSerializer”正确反序列化我的“School”对象以正确获取所有值。

注意:不能在“类”下有一个像 “Sections”这样的数组根标签。因为我的 xml 文档是自动生成的。我无法指定自己的格式。

谢谢...

【问题讨论】:

    标签: c# .net xml xml-parsing xml-deserialization


    【解决方案1】:

    试试这个:

        public class School
    {
        [XmlAttribute]
        public int numberOfFields { get; set; }
    
        [XmlArray("Classes")]
        [XmlArrayItem("Class", typeof(Class))]
        public List<Class> Classes { get; set; }
    
    }
    
    
    public class Class
    {
        [XmlAttribute]
        public string name { get; set; }
        [XmlAttribute]
        public string dataType { get; set; }
    
    
        [XmlElement("Section")]
        public List<Section> ClassSections { get; set; }
    
    }
    
    public class Section
    {
        [XmlAttribute]
        public string value { get; set; }
    }
    

    * 编辑 #1 **

    --------------- 由于 NumberOfFields 未读取更新结构 ----------------

    在我看来它的结构不正确,但是当你说它是一个自动生成的 XML 文件时,我认为它是最简单的阅读方式。

        public class School
    {
    
        [XmlElement("Classes")]
        public List<ArrayClass> Classes { get; set; }
    
    }
    
    public class ArrayClass
    {
        [XmlAttribute]
        public int numberOfFields { get; set; }
    
        [XmlElement("Class")]
        public List<Class> Class { get; set; }
    
    } 
    

    【讨论】:

    • 顺便说一句,我注意到numberOfFields 的值等于类的数量。如果这总是正确的,那么我建议将属性定义为 public int numberOfFields { get { return Classes == null ? 0 : Classes.Count; } }
    【解决方案2】:
        static void Main(string[] args)
        {
            var xml ="<?xml version=\"1.0\"?><School><Classes numberOfFields=\"5\"><Class name=\"10\" dataType=\"double\"><Section value=\"A\"/><Section value=\"B\"/><Section value=\"C\"/></Class><Class dataType=\"double\"/><Class dataType=\"double\"/><Class dataType=\"double\"/><Class dataType=\"double\"/></Classes></School>";
            School result;
            var serializer = new XmlSerializer(typeof(School));
            var xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xml);
            using (var reader = new XmlNodeReader(xmlDoc))
            {
                result = (School)serializer.Deserialize(reader);
            }
        }
    
    
    public class School
    {
        [XmlArray("Classes")]
        [XmlArrayItem("Class")]
        public List<Class> Classes { get; set; }
    }
    
    public class Class
    {
        [XmlElement("Section")]
        public List<Section> ClassSections { get; set; }
    }
    
    public class Section
    {
        [XmlAttribute("value")]
        public string Value { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-09-29
      • 2018-03-19
      • 2015-06-16
      • 1970-01-01
      • 2014-12-11
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多