15

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?

2 Answers 2

33

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:

enter image description here

Sign up to request clarification or add additional context in comments.

1 Comment

make sure you decorate each element/array/attribute only once
6

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.