Столкнулся с проблемой. У меня есть сложная xml
Надо это десериализовать в 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
public class Rec : IXmlSerializable
{
public int Id { get; set; }
public string Ts { get; set; }
public 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));
Комментариев нет:
Отправить комментарий