如何反序列化另一个列出的项目中存在的xml文件列出的项目

时间:2014-04-04 18:18:12

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

我有一个自动生成的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>

我使用&#34; XmlDeserializer&#34;反序列化。如下

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

XmlRootElement包含&#34; Class&#34;的集合。在&#34;班级&#34;标签和进一步的每个&#34; Class&#34;将包含&#34; Section&#34;。

的集合

在C#中,我已经声明要反序列化&#34; Classes&#34;进入班级列表。

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

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

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

我的问题是我无法正确获取章节值。因为我有&#34; Class&#34;作为第一部分和第二部分中的类名,我已经提到过#34; Class&#34;作为数组元素。那么任何人都可以告诉我如何正确地反序列化我的&#34;学校&#34;使用&#34; XmlSerializer&#34;正确地获得所有价值。

注意:不能有一个数组根标记,例如&#34; Sections&#34;在&#34; Class&#34; 。因为我的xml文档是自动生成的。我无法指定自己的格式。

...谢谢

2 个答案:

答案 0 :(得分:2)

试试这个:

    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; }

} 

答案 1 :(得分:1)

    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; }
}