2013-02-06 104 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; 
}