如何在c#中将xml反序列化为列表
Posted
技术标签:
【中文标题】如何在c#中将xml反序列化为列表【英文标题】:How to deserialize xml into list in c# 【发布时间】:2021-11-05 23:53:26 【问题描述】:我想在包含属性和列表的嵌套类中取消实现此 XML:
<BetradarLiveOdds timestamp="1630916055900" status="meta">
<Match active="0" booked="0" matchid="22546" status="ended">
<MatchInfo>
<DateOfMatch>16309114325</DateOfMatch>
<Sport id="32">Bos</Sport>
<Category id="266">Interonal</Category>
<Tournament id="99000526">Grd Pix 221</Tournament>
<HomeTeam id="45179">Mrk Roal</HomeTeam>
<AwayTeam id="41325">Mathew Whrs</AwayTeam>
<TvChannels />
</MatchInfo>
<Translation>
<Sport id="32">
<Name lang="en">Bols</Name>
<Name lang="it">Bols</Name>
</Sport>
<Category id="266">
<Name lang="en">Interonal</Name>
<Name lang="it">Internanale</Name>
</Category>
<Tournament id="99000526">
<Name lang="en">Grand Prix 2021</Name>
<Name lang="it">Grand Prix 2021</Name>
</Tournament>
<HomeTeam id="45179">
<Name lang="en">Mark Royal</Name>
<Name lang="it">Mark Royal</Name>
</HomeTeam>
<AwayTeam id="41325">
<Name lang="en">Matthew Whyers</Name>
<Name lang="it">Matthew Whyers</Name>
</AwayTeam>
</Translation>
</Match>
</BetradarLiveOdds>
我创建了多个可序列化的类:
[Serializable()]
public class BetradarLiveOdds
[XmlAttribute("timestamp")]
public long Timestamp get; set;
[XmlAttribute("status")]
public string Status get; set;
[XmlArrayItem("match")]
public List<Match> Matchs get; set;
[Serializable()]
public class Match
[XmlAttribute("active")]
public bool Active get; set;
[XmlAttribute("booked")]
public bool Booked get; set;
[XmlAttribute("matchid")]
public Int32 MatchId get; set;
[XmlAttribute("status")]
public string Status get; set;
[XmlElement("matchinfo")]
public MatchInfo MatchInfo get; set;
[XmlElement("translation")]
public List<Translation> Translations get; set;
还有其他小课程(运动、锦标赛、主场……)。
我尝试:当我尝试反序列化时:
static void Main(string[] args)
XmlSerializer serializer = new XmlSerializer(typeof(BetradarLiveOdds));
BetradarLiveOdds bet;
FileStream fs = new FileStream("C:\\src\\bet2020\\RD_Live_Parsing\\meta\\hi.xml", FileMode.Open);
bet = (BetradarLiveOdds)serializer.Deserialize(fs);
serializer.Serialize(Console.Out, bet);
BetradarLiveOdds
打印正常,但匹配为空。
有谁知道如何修改类或主要使其工作。如何取消实现文件?
【问题讨论】:
序列化你的类。如果 XML 与您尝试反序列化的 XML 不匹配,您就知道问题出在哪里。 我认为问题出在“BetradarLiveOdds”中,但我不知道如何解决 在您的课程中,您使用了List
,但XML 没有显示任何重复(例如多个Match
)。
因为即使 xml 有更多匹配项,该程序也应该可以工作。
您需要注意区分大小写。 [XmlArrayItem("match")]
应该是 [XmlArrayItem("Match")]
。
【参考方案1】:
如果您使用以下类定义,那么您的反序列化器 + 序列化器代码将适用于单个或多个 <Match>
节点:
[XmlRoot]
public class BetradarLiveOdds
[XmlElement]
public Match[] Match get; set;
[XmlAttribute(AttributeName = "timestamp")]
public string Timestamp get; set;
[XmlAttribute(AttributeName = "status")]
public string Status get; set;
我省略了所有不必要的属性
如果您需要列表而不是数组,XmlSerializer
也可以与 List<Match>
一起使用
public class Match
public MatchInfo MatchInfo get; set;
public Translation Translation get; set;
[XmlAttribute(AttributeName = "active")]
public string Active get; set;
[XmlAttribute(AttributeName = "booked")]
public string Booked get; set;
[XmlAttribute(AttributeName = "matchid")]
public string Matchid get; set;
[XmlAttribute(AttributeName = "status")]
public string Status get; set;
public class MatchInfo
public string DateOfMatch get; set;
public Common Sport get; set;
public Common Category get; set;
public Common Tournament get; set;
public Common HomeTeam get; set;
public Common AwayTeam get; set;
public string TvChannels get; set;
我引入了一个Common
类,可以在MatchInfo
和Translation
中使用
如果是MatchInfo
,Name
集合将为空(一个包含 0 元素的初始化列表)
如果不希望这样做,那么您可以引入另一个不包含 Name
属性的类
public class Translation
public Common Sport get; set;
public Common Category get; set;
public Common Tournament get; set;
public Common HomeTeam get; set;
public Common AwayTeam get; set;
public class Common
[XmlAttribute(AttributeName = "id")]
public string Id get; set;
[XmlText]
public string Text get; set;
[XmlElement]
public List<Name> Name get; set;
public class Name
[XmlAttribute(AttributeName = "lang")]
public string Lang get; set;
[XmlText]
public string Text get; set;
【讨论】:
以上是关于如何在c#中将xml反序列化为列表的主要内容,如果未能解决你的问题,请参考以下文章
无法反序列化 xml 数组以列出 web api 模型 c#