3

我需要对具有可变结构的 XML 文件进行反序列化。两个例子:

<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 实现这个?

4

2 回答 2

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

于 2012-07-20T11:40:09.933 回答
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>
于 2012-07-20T11:40:58.687 回答