Если вы не хотите сгенерировать XSD с N division_x
элементами, где x = [1..N], вы должны реализовать IXmlSerializable
.Следующий код прекрасно десериализует пример xml:
public class Sports : IXmlSerializable
{
public string LotName { get; set; }
public List<dynamic> Prices { get; set; }
#region IXmlSerializable Members
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
Prices = new List<dynamic>();
reader.Read();
LotName = reader.ReadElementContentAsString("lot_name", "");
reader.Read();
while (reader.Name.StartsWith("divisions_"))
{
reader.Read();
var i = reader.ReadElementContentAsString("divisions", "");
var m = reader.ReadElementContentAsString("match", "");
var p = reader.ReadElementContentAsString("pay", "");
Prices.Add(new { ID = i, Match = m, Pay = p });
reader.Read();
}
}
public void WriteXml(System.Xml.XmlWriter writer)
{
throw new NotImplementedException();
}
#endregion
}
public class Games {
[XmlElement("sports")]
public Sports Sports { get; set; }
}
[XmlRoot("body")]
public class Body
{
[XmlElement("games")]
public Games Games { get; set; }
}
Он использует XmlSerialization
, потому что я не совсем уверен, как это сделать с Data Contract Serializer
(хотя я знаю, что это можно сделать).И вы можете захотеть добавить обработку ошибок в метод ReadXml
.
PS.Вы можете сделать это с одним классом, который реализует XmlSerializer и испускает много динамических классов:)