#c_sharp #xml #aspnet
Столкнулся с проблемой. У меня есть сложная xml.Надо это десериализовать в class. Я не могу понять, как это сделать, если у меня может быть от с1 до с10000000. 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
Ответы
Ответ 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 ListRecs { 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));
Комментариев нет:
Отправить комментарий