Csharp/C#教程:如何在C#中反序列化包含多种类型元素的XML数组分享


如何在C#中反序列化包含多种类型元素的XML数组

我正在尝试反序列化以下文件:

   Wayne Stamkos 23 34   Sidney Lindros 41 44   Martin Roy 15 12   Paul Forsberg 21 51   Roberto Rinne 18 23    

使用以下代码:

 namespace ConsoleApplication2 { [XmlRoot("league")] public class League { [XmlArray("players")] [XmlArrayItem("skater")] public List skaters { get; set; } [XmlArrayItem("goalie")] public List goalies { get; set; } } public class Skater { [XmlElement("name")] public string Name; [XmlElement("goals")] public int Goals; [XmlElement("assists")] public int Assists; } public class Goalie { [XmlElement("name")] public string Name; [XmlElement("wins")] public int Wins; [XmlElement("losses")] public int Losses; } class Program { static void Main(string[] args) { using (FileStream reader = new FileStream(@"C:Temptest.xml", FileMode.Open, FileAccess.Read)) { var ser = new XmlSerializer(typeof(League)); League league = (League)ser.Deserialize(reader); } } } } 

我期待得到一个联盟对象,其中包含一个包含3个元素的Skaters列表和一个包含2个元素的守门员列表。 我确实得到了预期的Skaters列表但是守门员列表是空的。 我究竟做错了什么?

有两种方法可以做到这一点; 首先是做一些事情:

 [XmlArray("players")] [XmlArrayItem("skater", Type=typeof(Skater))] [XmlArrayItem("goalie", Type=typeof(Goalie))] public List Players { get; set; } 

它将两个元素类型映射到单个集合中。 最糟糕的情况是, SomeCommonBaseClass可能是object

 [XmlArray("players")] [XmlArrayItem("skater", Type=typeof(Skater))] [XmlArrayItem("goalie", Type=typeof(Goalie))] public List Players { get; set; } 

第二个是让映射到包装器对象:

 [XmlElement("players")] public Players Players { get;set;} ... public class Players { [XmlElement("skater")] public List Skaters {get;set;} [XmlElement("goalie")] public List Goalies {get;set;} } 

选择哪个取决于具体情况; 后者允许“至多一个守门员”之类的东西,通过将其改为:

上述就是C#学习教程:如何在C#中反序列化包含多种类型元素的XML数组分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

  [XmlElement("goalie")] public Goalie Goalie {get;set;} 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/997860.html

(0)
上一篇 2021年12月26日
下一篇 2021年12月26日

精彩推荐