Страницы

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

среда, 25 декабря 2019 г.

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

#c_sharp #xml #aspnet


Столкнулся с проблемой. У меня есть сложная 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.
    


Ответы

Ответ 1



Один из вариантов - реализовать интерфейс 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));

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

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