简体   繁体   中英

XML string deserialization into c# object

I receive xml file like this.

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

with many instances of programme and channel . I try to deserialize it into this c# object but I get a null instead of object:

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

What am I doing wrong and what would be the proper xml object class?

You will just have to change you Radio class a bit, since the 2 object types a mixed in the same array you will have to add some attributes to let the serializer know whats what.

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

Results:

在此输入图像描述

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

You can now iterate through channelLst

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM