将XML反序列化为C#2D列表

本文关键字:C#2D 列表 反序列化 XML | 更新日期: 2023-09-27 18:28:25

我正在尝试将XML文档转换为C#2D列表。但当我这样做时,列表是空的。。。

这是我的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<data>
  <levels>
    <level ID="0">
      <theItem ID="0">
        <type>Corner</type>
        <rotation>180</rotation>
        <positionX>-5.5</positionX>
        <positionY>-2.5</positionY>
      </theItem>
      <theItem ID="1">
        <type>TripleBar</type>
        <rotation>270</rotation>
        <positionX>-4.5</positionX>
        <positionY>-2.5</positionY>
      </theItem>
      <theItem ID="2">
        <type>Corner</type>
        <rotation>270</rotation>
        <positionX>-3.5</positionX>
        <positionY>-2.5</positionY>
      </theItem>
      <theItem ID="3">
        <type>Bar</type>
        <rotation>0</rotation>
        <positionX>-5.5</positionX>
        <positionY>-1.5</positionY>
      </theItem>
    </level>
  </levels>
</data>

这是我的课程:

[Serializable]
public class theItem
{
    [XmlAttribute("ID")]
    public string ID { get; set; }
    [XmlElement("type")]
    public string type { get; set; }
    [XmlElement("rotation")]
    public int rotation { get; set; }
    [XmlElement("positionX")]
    public int positionX { get; set; }
    [XmlElement("positionY")]
    public int positionY { get; set; }
}
[Serializable]
public class level
{
    [XmlAttribute("ID")]
    public string ID { get; set; }
    [XmlArray("level")]
    public List<theItem> theItems { get; set; }
}
[Serializable]
[XmlRoot("data")]
public class data
{
    [XmlArray("levels")]
    [XmlArrayItem("level")]
    public List<level> levels { get; set; }
}

这是我的反序列化程序代码:

var serializer = new XmlSerializer(typeof(data));
        using (var reader = XmlReader.Create("LevelData.xml"))
        {
            data info = (data)serializer.Deserialize(reader);
            List<level> levels = info.levels;
        }

问题是,当我试图检查每个列表的长度时,我的第一个列表的长度为1,这是正常的,但第二个列表的值为=0。。。我想说的是,我想得到一个这样的列表:列表<level>级别,并且在每个级别中都是List<项目>具有项目元素的项目,每个项目都有其内容,就像在XML文件中一样。。。我尝试了多种方法,但都没有找到解决问题的办法。提前感谢,为我糟糕的英语感到抱歉!

将XML反序列化为C#2D列表

我相信这可能会奏效。更改您的等级等级如下:

[Serializable]
public class level
{
    [XmlAttribute("ID")]
    public string ID { get; set; }
    [XmlArray("level")]
    public List<theItem> items { get; set; }
}

然后像这样更改xml:

<?xml version="1.0" encoding="utf-8"?>
<data>
  <levels>
    <level ID="0">
      <items>
      <theItem ID="0">
        <type>Corner</type>
        <rotation>180</rotation>
        <positionX>-5.5</positionX>
        <positionY>-2.5</positionY>
      </theItem>
      <theItem ID="1">
        <type>TripleBar</type>
        <rotation>270</rotation>
        <positionX>-4.5</positionX>
        <positionY>-2.5</positionY>
      </theItem>
      <theItem ID="2">
        <type>Corner</type>
        <rotation>270</rotation>
        <positionX>-3.5</positionX>
        <positionY>-2.5</positionY>
      </theItem>
      <theItem ID="3">
        <type>Bar</type>
        <rotation>0</rotation>
        <positionX>-5.5</positionX>
        <positionY>-1.5</positionY>
      </theItem>
    </items>
    </level>
  </levels>
</data>

编辑:

正如Ondrej正确指出的那样:大多数位置值不能序列化为int。因此,将这些更改为浮动会更好:

[XmlElement("positionX")]
public float positionX { get; set; }
[XmlElement("positionY")]
public float positionY { get; set; }

编辑2:更简单的解决方案

在原始XML文件中,使用<level>作为<theItem>的列表,因此必须更新对象以反映这一点。您可以简单地通过使级别像这样扩展列表并使用原始的XML结构来做到这一点:

[Serializable]
public class level : List<theItem>
{
    [XmlAttribute("ID")]
    public string ID { get; set; }
}