Xml反序列化要列出的数组

时间:2016-07-20 18:46:03

标签: c# .net

我有以下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个元素。

1 个答案:

答案 0 :(得分:3)

此:

[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的外观。它可能会给你一些关于问题所在的指示。

有关正常工作的演示,请参阅this fiddle,它会将两个行名称值打印到控制台。