2013-02-06 8 views
14

Ich empfange XML-Datei wie folgt.XML-String Deserialisierung in C# -Objekt

<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> 

mit vielen Fällen von Programm und Kanal. Ich versuche, es in diesem C# Objekt zu deserialisieren, aber ich erhalte eine Null anstelle des Objekts:

[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; 
    } 
} 

Was mache ich falsch und was wäre der richtige XML-Objektklasse sein?

Antwort

33

Sie müssen nur Ihnen etwas Radio Klasse ändern, da die zwei Objekttypen einem gemischten im gleichen Array Sie muss einige Attribute hinzufügen, damit der Serializer weiß, was was ist.

[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() 
    { 
    } 
} 

Ergebnisse:

enter image description here

+2

sicherstellen, dass Sie nur einmal jedes Element/array/Attribut schmücken – dubi

6

Verwenden 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 
} 
); 

können Sie jetzt durch channelLst iterieren

foreach(var c in channelLst) 
{ 
    c.id; 
    c.displayName; 
} 
Verwandte Themen