如何在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】:

如果您使用以下类定义,那么您的反序列化器 + 序列化器代码将适用于单个或多个 &lt;Match&gt; 节点:

[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&lt;Match&gt; 一起使用
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 类,可以在MatchInfoTranslation 中使用 如果是MatchInfoName 集合将为空(一个包含 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 反序列化为 C# 中的对象? [复制]

在 C# 中将 JSON 数组反序列化为对象

无法反序列化 xml 数组以列出 web api 模型 c#

如何在将 xml 反序列化为 c# 对象时获取单个 xml 元素的多个值?

如何将 xml 元素值反序列化为 C# 类属性

将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串