Xml将数组反序列化为列表

本文关键字:列表 反序列化 数组 Xml | 更新日期: 2023-09-27 17:57:59

我有以下xml

<result>
    <key accessMask="4294967295" type="Account" expires="">
        <rowset name="characters" key="characterID" columns="characterID,characterName,corporationID,corporationName,allianceID,allianceName,factionID,factionName">
            <row characterID="123" characterName="Sefa 123" corporationID="456" corporationName="Signal Cartel" allianceID="159" allianceName="Scouts" factionID="0" factionName=""/>
            <row characterID="1234" characterName="Sefa 1234" corporationID="987" corporationName="Havos" allianceID="753" allianceName="Unlimited" factionID="0" factionName=""/>
        </rowset>
     </key>
</result>

我有下面的Schema设置来反序列化这个输出。

    [XmlRoot("result")]
    public class ApiKeyInfo
    {
        [XmlElement("key")]
        public Key Key { get; set; }
    }
    public class Key
    {
        [XmlAttribute("accessMask")]
        public long AccessMask { get; set; }
        [XmlAttribute("type")]
        public string Type { get; set; }
        [XmlElement("rowset")]
        public List<AccountCharacter> Characters { get; set; }
    }
    public class AccountCharacter
    {
        [XmlAttribute("characterId")]
        public long Id { get; set; }
        [XmlAttribute("characterName")]
        public string Name { get; set; }
        [XmlAttribute("corporationID")]
        public long CorpId { get; set; }
        [XmlAttribute("corporationName")]
        public string CorpName { get; set; }
        [XmlAttribute("allianceID")]
        public long AllianceId { get; set; }
        [XmlAttribute("allianceName")]
        public string AllianceName { get; set; }
        [XmlAttribute("factionID")]
        public long FactionId { get; set; }
        [XmlAttribute("factionName")]
        public string FactionName { get; set; }
    }

问题是,我无法反序列化字符信息。字符列表中始终包含0个元素。

Xml将数组反序列化为列表

这:

[XmlElement("rowset")]
public List<AccountCharacter> Characters { get; set; }

意味着您将拥有一堆rowset元素,例如:

<rowset characterID="123" characterName="Sefa 123" ...

试试这个:

[XmlArray("rowset")]
[XmlArrayItem("row")]
public List<AccountCharacter> Characters { get; set; }

对于这类去序列化问题,一个有用的技巧是反向尝试这个过程:创建一个对象并对其进行序列化,看看XML是什么样子的。它可能会给你一些关于你的问题在哪里的指示

请看这个fiddle的工作演示,它将两个行名值都打印到控制台。