. net XML反序列化
本文关键字:反序列化 XML net | 更新日期: 2023-09-27 18:07:15
我有以下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>
看这里,一个很好的解释。
xsd.exe是一个方便的小工具,随。net SDK(软件开发工具包)而来开发工具包),可以让生活变得简单,当你想要快速走从XML输入到强类型的。net对象。
如果从XML文件开始:
1)在Visual Studio中打开XML文件2)在XML菜单中单击"创建架构"。这将生成一个XSD文件。
看一下这个关于如何进行XML序列化的教程,其中的示例与您的示例非常接近。
基本上你需要创建一个类来代表你的XML中的每个实体(例如Sports
)和相应的属性,然后使用XmlSerializer来反序列化它。
更复杂的方法,但是您可以处理奇怪的<division_X>
标记,将使用XmlReader
并自己读取元素并将其分配给适当的类/对象。
除非您想生成包含N个division_x
元素的XSD,其中x = [1..]你必须执行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
方法中添加一些错误处理。
p。您可以使用一个实现XmlSerializer并发出大量动态类的类来实现它:)