2012-07-20 31 views
3

我需要對具有可變結構的XML文件進行deserilize。兩個例子:反序列化可變結構的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實現這個嗎?

感謝advandce!

回答

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任何嵌套的深度合作。

+0

非常感謝! – S0me0ne 2012-07-20 13:32:44

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>