2011-09-02 75 views
1

我需要一个建议。我正在Silverlight中开发一些简单的游戏,我需要从XML到List加载级别定义,但我不确定什么是最好的方式来做到这一点。如何从XML加载数据到列表

我的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; } 
    } 
    ... 
} 

能否请您给我一个建议如何做到这一点?

回答

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(); 
} 
+0

我们是否也应该假设诸如PositionX的值是整数而不是字符串? – AnthonyWJones

+0

非常感谢,该属性是整数,但它使用Convert.ToInt32(l.Attribute(“startingX”)。值),它完全适合我。 – Gabbo

+0

很高兴它的作品。理想情况下,您还需要进行圆顶排序检查,看看该值是否为空以及是否与整数兼容。 – arviman

1

我会考虑在这里使用LinqToXml。

我写了一个快速演示,但这个问题表明你需要的概念相当不错@

De/Serialize directly To/From XML Linq

编辑:为清楚起见,如果你确保你的电池类都被注解那些Xml属性,反序列化行为应该适合你。

+0

感谢您的答复。我的单元类和Level类一样被注释了(没有注释)。但是你能否给我写一个反序列化的小圆顶?我可以让它工作.. – Gabbo

+0

当我回到我的电脑时,我会尝试为你发布一个例子! –