. 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>

. net XML反序列化

看这里,一个很好的解释。

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并发出大量动态类的类来实现它:)

相关文章: