我有以下XML提要。我需要对对象的List进行反序列化。如何在.NET 4.0 C#中实现这一点?
<body>
<games>
<sports>
<lot_name>Football</lot_name>
<prizes>
<!-- For each prize the "division_" tag ends with different number -->
<divisions_1>
<divisions>1</divisions>
<match>5-2</match>
<pay>$10</pay>
</divisions_1>
<divisions_2>
<divisions>2</divisions>
<match>3-2</match>
<pay>$5</pay>
</divisions_2>
</prizes>
</sports>
</games>
</body>发布于 2011-09-02 21:13:08
看看here,这是一个很好的解释。
XML (软件开发工具包)附带的
xsd.exe是一个方便的小工具,当您想要将.NET输入快速转换为强类型的.NET对象时,它可以使您的工作变得简单。
如果您从XML文件开始:
1)在Visual Studio中打开XML文件
2)从XML菜单中点击"Create Schema“。这将生成一个XSD文件。
rest here。
发布于 2011-09-02 21:12:53
请看THIS教程中关于如何进行XML序列化的内容,其中的示例与您的非常接近。
基本上,您需要创建一个类来表示XML中的每个实体(例如Sports)和相应的属性,然后使用XmlSerializer对其进行反序列化。
更复杂的方法是使用 并自己读取元素,然后将其分配给适当的类/对象。
发布于 2011-09-02 22:47:33
除非您想生成一个包含N个division_x元素的XSD,其中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并发出大量动态类的类来实现:)
https://stackoverflow.com/questions/7283884
复制相似问题