简体   繁体   English

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

[英]How to Deserialize a xml file's listed items which is present within another listed items

I have an auto generated xml file with the following format. 我有一个具有以下格式的自动生成的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>

I deserialize using "XmlDeserializer" as follows 我使用“ XmlDeserializer”反序列化如下

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

XmlRootElement contains a collection of "Class" under "Classes" tag and further each "Class" would contain Collection of "Section". XmlRootElement在“类”标签下包含“类”的集合,并且每个“类”还将包含“部分”的集合。

And in C#, I have declared like this to deserialize "Classes" into a List of classes. 在C#中,我已经声明要像这样将“类”反序列化为类列表。

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

Now to further deserialize Class into List of Sections, I have added the code as below. 现在,为了进一步将类反序列化为部分列表,我添加了以下代码。

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

My problem is I couldn't get the List of Sections values properly. 我的问题是我无法正确获取“节列表”值 Because I have "Class" as a class name in the first part and in second part I have mentioned same "Class" as Array element. 因为我在第一部分和第二部分中都将“ Class”作为类名,所以我提到了与“ Array”元素相同的“ Class”。 So could any one tell how can I properly Deserialize my "School" object using "XmlSerializer" to get all the values properly. 因此,谁能说出如何使用“ XmlSerializer”正确反序列化“ School”对象以正确获取所有值。

Note: I cannot have a Array root tag like "Sections" under "Class" . 注意:不能 在“ Class”下有Array根标签,例如“ Sections” Because my xml document is auto generated. 因为我的xml文档是自动生成的。 I cannot specify my own format. 我无法指定自己的格式。

Thanks... 谢谢...

try this : 尝试这个 :

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

* EDIT #1 ** *编辑#1 **

--------------- Update Structure due to NumberOfFields is not readed ---------------- ---------------由于NumberOfFields而导致的更新结构未读取----------------

in my opinion it's not correct structure, but when u said it's an auto generated XML file, i think it simplest way to read it. 我认为这不是正确的结构,但是当您说这是一个自动生成的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; }

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM