Десериализация дескриптора XML в объект С#
Я получаю xml файл, подобный этому.
<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>
со многими экземплярами программы и канала. Я пытаюсь десериализовать его в этом объекте С#, но я получаю null вместо объекта:
[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?
Ответы
Ответ 1
Вам просто нужно немного поменять класс 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
Используйте 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;
}