使用可变结构反序列化XML文件

时间:2012-07-20 11:34:03

标签: c# xml serialization

我需要对XML文件进行deserilize,该文件具有可变结构。两个例子:

<xml>
    <OrgUnit GUID="1111">
        <OrgUnit GUID="2222">
            <OrgUnit GUID="3333" />
            <OrgUnit GUID="4444" />
            ...
        </OrgUnit>
    </OrgUnit>
</xml>

<xml>
    <OrgUnit GUID="1111" />
    <OrgUnit GUID="2222" />
    <OrgUnit GUID="3333">
        <OrgUnit GUID="4444" />
        <OrgUnit GUID="5555" />
    </OrgUnit>
</xml>

...

如您所见,元素名称始终相同。问题是,元素的嵌套总是变化。有没有办法用XmlSerializer实现这个?

先谢谢!

2 个答案:

答案 0 :(得分:3)

public class xml
{
    [XmlElement("OrgUnit")]
    public OrgUnit[] OrgUnits { get; set; }
}

public class OrgUnit
{
    [XmlAttribute]
    public int GUID { get; set; }

    [XmlElement("OrgUnit")]
    public OrgUnit[] OrgUnits { get; set; }
}

然后:

class Program
{
    static void Main()
    {
        var serializer = new XmlSerializer(typeof(xml));
        using (var reader = XmlReader.Create("test.xml"))
        {
            var result = (xml)serializer.Deserialize(reader);
        }
    }
}

它适用于任何嵌套深度OrgUnit

答案 1 :(得分:0)

当使用xml文档作为起点时,我总是更喜欢xsd作为文件和解析代码之间的契约。请注意,我使用'OrgUnits'作为根节点。

您可以使用xsd.exe为您创建可序列化的类。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="OrgUnits">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="OrgUnit"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="OrgUnit">
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="OrgUnit"/>
      </xs:sequence>
      <xs:attribute name="GUID" use="required" type="xs:integer"/>
    </xs:complexType>
  </xs:element>
</xs:schema>