2013-02-06 107 views
14

我收到這樣的xml文件。將XML字符串反序列化到c#對象中

<radio> 
    <channel id="Opus"> 
    <display-name>Opus</display-name> 
    <icon src="" /> 
    </channel> 
    <channel id="Klasika"> 
    <display-name>Klasika</display-name> 
    <icon src="" /> 
    </channel> 
    <channel id="LR"> 
    <display-name>LR</display-name> 
    <icon src="" /> 
    </channel> 
    <programme channel="Opus" start="20130203060000" stop="20130203110000" duration="050000"> 
    <title lang="lt">OPUS muzika.</title> 
    <desc lang="lt">OPUS muzika.</desc> 
    <category lang="lt">muzikos laidos</category> 
    <date>2013.02.03</date> 
    </programme> 
    <programme channel="Opus" start="20130203110000" stop="20130203150000" duration="040000"> 
    <title lang="lt">Vėlyvi pusryčiai su OPUS.</title> 
    <desc lang="lt">Vėlyvi pusryčiai su OPUS.</desc> 
    <category lang="lt">muzikos laidos</category> 
    <date>2013.02.03</date> 
    </programme> 
</radio> 

程序通道的許多實例。我嘗試將其反序列化到這個C#的對象,但我得到一個空,而不是對象:

[XmlRoot("radio")] 
public sealed class radio 
{ 
    [XmlRoot("channel")] 
    public sealed class channel 
    { 
     [XmlAttribute("id")] 
     public string id { get; set; } 

     [XmlElement("display-name")] 
     public string displayName { get; set; } 

     [XmlElement("icon")] 
     public string icon { get; set; } 

     public channel() 
     {  
     } 
    } 

    [XmlRoot("programme")] 
    public sealed class programme 
    { 
     [XmlAttribute("channel")] 
     public string channel { get; set; } 

     [XmlAttribute("start")] 
     public string start { get; set; } 

     [XmlAttribute("stop")] 
     public string stop { get; set; } 

     [XmlAttribute("duration")] 
     public string duration { get; set; } 

     [XmlElement("title")] 
     public string title { get; set; } 

     [XmlElement("desc")] 
     public string desc { get; set; } 

     [XmlElement("category")] 
     public string category { get; set; } 

     [XmlElement("date")] 
     public string date { get; set; } 

     public programme() 
     { 
     } 
    } 

    [XmlArray] 
    public channel[] channels { get; set; } 

    [XmlArray] 
    public programme[] programmes { get; set; } 

    public radio() 
    { 
     channels = null; 
     programmes = null; 
    } 

    public static radio FromXmlString(string xmlString) 
    { 
     var reader = new StringReader(xmlString); 
     var serializer = new XmlSerializer(typeof(radio)); 
     var instance = (radio)serializer.Deserialize(reader); 

     return instance; 
    } 
} 

我在做什麼錯的,什麼是正確的XML對象類?

回答

33

你只需要改變你Radio類一點,因爲2的對象類型在同一陣列中混合您將不得不添加一些屬性讓序列化程序知道最新的內容。

[XmlRoot("radio")] 
public sealed class radio 
{ 
    [XmlElement("channel", Type = typeof(channel))] 
    public channel[] channels { get; set; } 

    [XmlElement("programme", Type = typeof(programme))] 
    public programme[] programmes { get; set; } 

    public radio() 
    { 
     channels = null; 
     programmes = null; 
    } 

    public static radio FromXmlString(string xmlString) 
    { 
     var reader = new StringReader(xmlString); 
     var serializer = new XmlSerializer(typeof(radio)); 
     var instance = (radio)serializer.Deserialize(reader); 

     return instance; 
    } 
} 

[Serializable] 
public class channel 
{ 
    [XmlAttribute("id")] 
    public string id { get; set; } 

    [XmlElement("display-name")] 
    public string displayName { get; set; } 

    [XmlElement("icon")] 
    public string icon { get; set; } 

    public channel() 
    { 
    } 
} 


[Serializable] 
public sealed class programme 
{ 
    [XmlAttribute("channel")] 
    public string channel { get; set; } 

    [XmlAttribute("start")] 
    public string start { get; set; } 

    [XmlAttribute("stop")] 
    public string stop { get; set; } 

    [XmlAttribute("duration")] 
    public string duration { get; set; } 

    [XmlElement("title")] 
    public string title { get; set; } 

    [XmlElement("desc")] 
    public string desc { get; set; } 

    [XmlElement("category")] 
    public string category { get; set; } 

    [XmlElement("date")] 
    public string date { get; set; } 

    public programme() 
    { 
    } 
} 

結果:

enter image description here

+2

確保你裝飾的每個元素/陣列/屬性只有一次 – dubi

6

使用LINQ2XML

XElement doc=XElement.Load("yourXML.xml"); 
var channelLst=doc.Elements("channel").Select(x=> 
new 
{ 
    id=x.Attribute("id").Value, 
    displayName=x.Element("display-name").Value, 
    icon=x.Element("icon").Attribute("src").Value 
} 
); 

您現在可以通過channelLst

迭代
foreach(var c in channelLst) 
{ 
    c.id; 
    c.displayName; 
}