我需要对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实现这个?
先谢谢!
答案 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>