【问题标题】:How to load data from XML to List如何将数据从 XML 加载到 List
【发布时间】:2011-09-02 22:43:02
【问题描述】:

我需要一个建议。我正在用 silverlight 开发一些简单的游戏,我需要将关卡定义从 XML 加载到 List,但我不确定最好的方法是什么。

我的 xml 看起来像

<Levels>
  <Level levelNumber = "1" startingX="2" startingY="2">
    <Cells>
      <Cell CellType="A" PositionX="0" PositionY="0" />
      <Cell CellType="A" PositionX="1" PositionY="0" />
      <Cell CellType="A" PositionX="2" PositionY="0" />
      <Cell CellType="A" PositionX="3" PositionY="0" />
      <Cell CellType="A" PositionX="4" PositionY="0" />
      <Cell CellType="A" PositionX="5" PositionY="0" />
      <Cell CellType="A" PositionX="0" PositionY="1" />
      <Cell CellType="B" PositionX="1" PositionY="1" />
      <Cell CellType="B" PositionX="2" PositionY="1" />
      <Cell CellType="B" PositionX="3" PositionY="1" />
      <Cell CellType="B" PositionX="4" PositionY="1" />
      <Cell CellType="B" PositionX="5" PositionY="1" />
      <Cell CellType="A" PositionX="1" PositionY="2" />
      <Cell CellType="B" PositionX="2" PositionY="2" />
      <Cell CellType="B" PositionX="3" PositionY="2" />
      <Cell CellType="B" PositionX="4" PositionY="2" />
      <Cell CellType="A" PositionX="5" PositionY="2" />
      <Cell CellType="A" PositionX="1" PositionY="3" />
      <Cell CellType="B" PositionX="2" PositionY="3" />
      <Cell CellType="B" PositionX="3" PositionY="3" />
      <Cell CellType="B" PositionX="4" PositionY="3" />
      <Cell CellType="A" PositionX="4" PositionY="3" />
    </Cells>
  </Level>
</Levels>

我需要加载关卡来列出 我的等级课程

public class Level
{
    private int levelNumber;
    private int startingX;
    private int startingY;
    public List<Cell> cellList = new List<Cell>();

    public int LevelNumber
    {
       get { return levelNumber; }
       set { levelNumber = value; }
    }
    ...
}

你能给我一个建议吗?

【问题讨论】:

    标签: xml silverlight linq c#-4.0


    【解决方案1】:

    我会在这里快速创建一些类似的东西(假设您的 xml 中有多个级别):

    XDocument xdoc = XDocument.Load(url); // assuming you're pulling your xml from a service. 
    
    if (xdoc != null)
    {
        var levels =
            (from l in xdoc.Descendants("Level")
                select new Level
                {
                    levelNumber = l.Attribute("levelNumber").Value,
                    startingX = l.Attribute("startingX").Value,
                    startingY = l.Attribute("startingy").Value,
                    cellsList = (from c in l.Descendants("Cell")
                                select new Cell
                                {
                                    CellType = c.Attribute("CellType").Value,
                                    PositionX = c.Attribute("PostionX").Value,
                                    PositionY = c.Attribute("PositionY").Value
                                }).ToList()
                }
            ).ToList();
    }
    

    【讨论】:

    • 我们是不是也应该假设 PositionX 等值是整数而不是字符串?
    • 非常感谢,属性是整数,但它使用 Convert.ToInt32(l.Attribute("startingX").Value) 并且它完全适合我..
    • 很高兴它有效。理想情况下,您还希望检查该值是否不为空以及它是否与整数兼容。
    【解决方案2】:

    我会考虑在这里使用 LinqToXml。

    我会写一个快速演示,但这个问题很好地展示了你需要的概念@

    De/Serialize directly To/From XML Linq

    编辑:为清楚起见,如果您确保您的 Cell 类使用这些 Xml 属性进行注释,则反序列化行为应该适合您。

    【讨论】:

    • 感谢您的回复。我的 Cell 类和 Level 类都被注释了(没有发布带有注释的行)。但是你能不能给我写个小圆顶用于反序列化?我可以让它工作..
    • 当我回到我的电脑上时,我会尝试为你发布一个示例!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2015-07-01
    • 2011-05-04
    相关资源
    最近更新 更多