2012-07-31 53 views
1

我想使用c#反序列化xml文件。如何將具有不同名稱的xml節點反序列化到列表中

文件有以下形式:

<parent> 
    <TotProd Name="Total Produce Kwh"> 
     <Time value="00:00:00">10</Time> 
     <Time value="00:30:00">10</Time> 
     ............ 
    </TotProd> 
    <ProdToNet Name="Produce to Net (iec)"> 
     <Time value="00:00:00">10</Time> 
     <Time value="00:30:00">10</Time> 
     ........... 
    </ProdToNet> ..... 
</parent> 

我想要的parent所有子元素反序列化到一個List<Myclass>TotProd/ProdToNetMyclass屬性。

我該怎麼做。

+0

提供您的課程細節也.. – 2012-07-31 08:44:01

回答

4

可以使用普通類兩種元素,如果它們具有相同的結構:

public class Time{ 
    [XmlAttrubute] 
    public string value {get; set; } 
    [XmlText] 
    public string Text {get;set;} // this will hold the innerText value ("10") of <Time> 
} 

public class Prod{ 

    [XmlAttrubute] 
    public string Name {get; set; } 
    [XmlElement("Time")] 
    public List<Time> Time {get; set; } 
} 

[XmlRoot("parent")] 
public class Parent{ 
    [XmlElement(ElementName="ProdToNet", Type=typeof(Prod))] 
    [XmlElement(ElementName="TotProd", Type=typeof(Prod))] 
    public List<Prod> {get; set;} 
} 

UPDATE: 的Time:value似乎是一個時間跨度持續時間對象,因此它可以表現爲:

public class Time{ 
    [XmlIgnore] 
    public TimeSpan _duration; 

    [XmlAttrubute(DataType = "duration")] 
    public string value 
     get 
     { 
      return XmlConvert.ToString(this._duration); 
     } 

     set 
     { 
      this._duration = XmlConvert.ToTimeSpan(value); 
     } 
    } 
+0

謝謝。我還必須添加XmlChoiceIdentifier屬性,如此處顯示的「http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlchoiceidentifierattribute.aspx」。如果能夠將所有子元素反序列化爲列表,即使不事先知道元素的名稱也是很好的。 – Daniel 2012-07-31 09:09:01

+0

您可以使用[XmlAnyElement]屬性來處理所有元素而不必知道它們的名稱,然後只需手動將其反序列化即可:http://msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlattributes.xmlanyelements – Tisho 2012-07-31 09:16:18

相關問題