Страницы

Поиск по вопросам

среда, 28 ноября 2018 г.

Парсинг сложной Xml в С#

Столкнулся с проблемой. У меня есть сложная xml
Watershed0001150 Watershed-0000001150 14 ff 06/03/2015 00:00:00 06/03/2015 00:00:00 117 10.5 06/03/2015 01:00:00 100 7
Надо это десериализовать в class. Я не могу понять, как это сделать, если у меня может быть от с1 до с10000000


Ответ

Один из вариантов - реализовать интерфейс IXmlSerializable, например:
[XmlRoot("XML")] public class Xml { [XmlAttribute("id")] public string Id { get; set; } [XmlElement("DATA")] public Data Data { get; set; } }
public class Data { [XmlElement("SRL_NUM")] public string SrlNum { get; set; } [XmlElement("METER_ID")] public string MeterId { get; set; } [XmlElement("MAC")] public string Mac { get; set; } [XmlElement("METER_ADDR")] public string MeterAddr { get; set; } [XmlElement("METER_TIME")] public string MeterTime { get; set; } [XmlElement("REC")] public List Recs { get; } = new List(); }
public class Rec : IXmlSerializable { public int Id { get; set; } public string Ts { get; set; } public List Cs { get; } = new List();
public XmlSchema GetSchema() => null;
public void ReadXml(XmlReader reader) { Id = int.Parse(reader.GetAttribute("id")); reader.ReadStartElement(); Ts = reader.ReadElementContentAsString("TS", ""); while (reader.NodeType == XmlNodeType.Element) Cs.Add(reader.ReadElementContentAsDouble()); reader.ReadEndElement(); }
public void WriteXml(XmlWriter writer) { writer.WriteStartAttribute("id"); writer.WriteValue(Id); writer.WriteEndAttribute(); writer.WriteStartElement("TS"); writer.WriteValue(Ts); writer.WriteEndElement(); for (int i = 0; i < Cs.Count; ++i) { writer.WriteStartElement("C" + (i + 1)); writer.WriteValue(Cs[i]); writer.WriteEndElement(); } } }
Десериализация вполне стандартна:
string s = @"..."; var ser = new XmlSerializer(typeof(Xml)); var xml = (Xml)ser.Deserialize(new StringReader(s));

Комментариев нет:

Отправить комментарий