C# 如何在C中反序列化包含多种类型元素的XML数组#
我正在尝试反序列化以下文件:C# 如何在C中反序列化包含多种类型元素的XML数组#,c#,xml,c#-4.0,deserialization,C#,Xml,C# 4.0,Deserialization,我正在尝试反序列化以下文件: <league> <players> <skater> <name>Wayne Stamkos</name> <goals>23</goals> <assists>34</assists> </skater> <sk
<league>
<players>
<skater>
<name>Wayne Stamkos</name>
<goals>23</goals>
<assists>34</assists>
</skater>
<skater>
<name>Sidney Lindros</name>
<goals>41</goals>
<assists>44</assists>
</skater>
<goalie>
<name>Martin Roy</name>
<wins>15</wins>
<losses>12</losses>
</goalie>
<skater>
<name>Paul Forsberg</name>
<goals>21</goals>
<assists>51</assists>
</skater>
<goalie>
<name>Roberto Rinne</name>
<wins>18</wins>
<losses>23</losses>
</goalie>
</players>
</league>
韦恩·斯坦科斯
23
34
西德尼·林德罗斯
41
44
马丁·罗伊
15
12
保罗·福斯伯格
21
51
罗伯托·里恩
18
23
使用以下代码:
namespace ConsoleApplication2
{
[XmlRoot("league")]
public class League
{
[XmlArray("players")]
[XmlArrayItem("skater")]
public List<Skater> skaters { get; set; }
[XmlArrayItem("goalie")]
public List<Goalie> 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:\Temp\test.xml", FileMode.Open, FileAccess.Read))
{
var ser = new XmlSerializer(typeof(League));
League league = (League)ser.Deserialize(reader);
}
}
}
}
命名空间控制台应用程序2
{
[XmlRoot(“联盟”)]
公共阶级联盟
{
[XmlArray(“玩家”)]
[XmlArrayItem(“滑冰者”)]
公开名单滑冰者{get;set;}
[XmlArrayItem(“守门员”)]
公共列表守门员{get;set;}
}
公共级滑冰运动员
{
[XmlElement(“名称”)]
公共字符串名称;
[XmlElement(“目标”)]
公共目标;
[XmlElement(“协助”)]
公共援助;
}
公开级守门员
{
[XmlElement(“名称”)]
公共字符串名称;
[XmlElement(“wins”)]
公众赢;
[XmlElement(“损失”)]
公共损失;
}
班级计划
{
静态void Main(字符串[]参数)
{
使用(FileStream reader=newfilestream(@“C:\Temp\test.xml”、FileMode.Open、FileAccess.Read))
{
var ser=新的XmlSerializer(typeof(League));
League=(League)序列反序列化(reader);
}
}
}
}
我希望得到一个联盟对象,其中包含一个包含3个元素的溜冰者列表和一个包含2个元素的守门员列表。我确实得到了预期的滑冰选手名单,但守门员名单是空的。我做错了什么?有两种方法;首先是做一些类似的事情:
[XmlArray("players")]
[XmlArrayItem("skater", Type=typeof(Skater))]
[XmlArrayItem("goalie", Type=typeof(Goalie))]
public List<SomeCommonBaseClass> Players { get; set; }
第二个是将
映射到包装器对象:
[XmlElement("players")]
public Players Players { get;set;}
...
public class Players
{
[XmlElement("skater")]
public List<Skater> Skaters {get;set;}
[XmlElement("goalie")]
public List<Goalie> Goalies {get;set;}
}
你需要一个守门员和滑冰者共用的界面,然后你可以有一个数组。@Marc Gravell:该文件可以包含0到N个守门员和滑冰者。@ChrisB d'oh;如果我用我的眼睛,我可以自己回答这个问题;因为我真的需要两个单独的列表,解决方案2似乎是我唯一的选择。谢谢第二种解决方案是实现这一点的一种非常优雅的方法+1.
[XmlElement("players")]
public Players Players { get;set;}
...
public class Players
{
[XmlElement("skater")]
public List<Skater> Skaters {get;set;}
[XmlElement("goalie")]
public List<Goalie> Goalies {get;set;}
}
[XmlElement("goalie")]
public Goalie Goalie {get;set;}