【问题标题】:Deserialize XML file with variable structure反序列化具有可变结构的 XML 文件
【发布时间】:2012-07-20 11:34:03
【问题描述】:

我需要对具有可变结构的 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 来实现这个?

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:
    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 的任何嵌套深度。

    【讨论】:

      【解决方案2】:

      当使用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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多