【问题标题】:c# XML array deserialization returns only first elementc# XML数组反序列化只返回第一个元素
【发布时间】:2017-10-05 02:01:23
【问题描述】:

我需要反序列化下一个 XML,但结果数组只包含第一个元素:

<data>
<cards>
    <card id="1">
        <title>card1text</title>
        <category>card1cat</category>
    </card>
    <card id="2">
        <title>card2text</title>
        <category>card2cat</category>
    </card>
    <card id="3">
        <title>card3text</title>
        <category>card3cat</category>
    </card>
</cards> 
</data>

要创建的对象:

[XmlRoot("data")]
public class Data
{
    [XmlArray("cards")]
    [XmlArrayItem("card", typeof(Card))]
    public Card[] cards { get; set; }
}

public class Card
{
    [XmlAttribute("id")]
    public int id { get; set; }
    public string title { get; set; }
    public string category { get; set; }
}

反序列化:

public Data data { get; private set; }

private void Awake()
{
    var deserializer = new XmlSerializer(typeof(Data));
    var stream = new StreamReader(filePath);
    data = deserializer.Deserialize(stream) as Data;
    stream.Close();

    if (data.cards != null)
    {
        foreach (var card in data.cards)
        {
            print("card " + card.id + " " + card.title);
        }
    }
}

反序列化似乎工作正常,但我只得到第一个元素的数组 我尝试使用 [XmlElement] 而不是 XmlArray,但也失败了。 提前谢谢你。

【问题讨论】:

  • 您的代码工作正常,只需再次检查 xml 文件
  • 让我解释一下 [XElement] 和 [XmlArray] 之间的区别。 [XmlArray] 需要两层标签,如 xml 中的卡片和卡片。所以你只需要一张类卡(或卡不是两者)。当您使用 [XElement] 时,您需要为每个标签设置一个类。所以你需要一个类 Cards 和一个类 Card。

标签: c# xml deserialization


【解决方案1】:

例如,您可以使用http://xmltocsharp.azurewebsites.net/ 从 xml 中获取 C# 类。

[XmlRoot(ElementName = "card")]
    public class Card
    {
        [XmlElement(ElementName = "title")]
        public string Title { get; set; }
        [XmlElement(ElementName = "category")]
        public string Category { get; set; }
        [XmlAttribute(AttributeName = "id")]
        public string Id { get; set; }
    }

    [XmlRoot(ElementName = "cards")]
    public class Cards
    {
        [XmlElement(ElementName = "card")]
        public List<Card> Card { get; set; }
    }

    [XmlRoot(ElementName = "data")]
    public class Data
    {
        [XmlElement(ElementName = "cards")]
        public Cards Cards { get; set; }
    }

【讨论】:

  • 非常感谢!但是谁会把我生命中的 6 个小时归还给我呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 2011-07-12
  • 2019-03-11
  • 1970-01-01
相关资源
最近更新 更多