【问题标题】:How to deserialize xml into list in c#如何在c#中将xml反序列化为列表
【发布时间】: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")]

标签: c# xml list serialization deserialization


【解决方案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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    相关资源
    最近更新 更多