2013-02-05 27 views
1

我知道,对于这个话题吨帖子的,但因为我的职位期间读取两天,没有什么工作,我决定问这里。 我有一个XML(Level01.xml)文件中像这样如何通过XML的XDocument的XElement属性在C#切换

<map version="1.0"> 
<tileset> 
    <image source="....> 
</tileset> 
<layer name="background"> 
    <data encoding="csv"> 
    3,3,3,3,3,3,3, 
    3,3,3,3,3,3,3, 
    3,3,3,3,3,3,3, 
    3,3,3,3,3,3,3 
    </data> 
</layer> 
<layer name="walls"> 
    <data encoding="csv"> 
    182,182,182,182,182,8,8, 
    182,8,182,8,8,8,8, 
    182,182,182,182,182,8,8, 
    182,8,182,8,8,8,8, 
    </data> 
</layer> 
</map> 

它是一种(瓦片)地图与不同层次,我希望把它收回去XNA。因此,我想从各层的数据读入string[] 这是我试过,但它不会为第二string[] walldata工作,我绝对绝望,因为我不明白为什么

public class LevelXmlReader 
{ 
    public string[] backgroundData; 
    public string[] wallData; 

    LevelXmlReader() 
    { 
     XDocument doc = XDocument.Load(@"Level/Level01.xml"); 
     foreach (XElement layer in doc.Element("map").Descendants("layer")) 
     { 

      var lay = doc.Element("map").Element("layer"); 
      var layName = lay.Attribute("name").Value; 
      switch (layName) 
      { 
       case "background": 
        { 
         backgroundData = lay.Element("data").Value.Split(','); 
        } 
        break; 
       case "walls": 
        { 
         wallData = lay.Element("data").Value.Split(','); 
        } 
        break; 
      } 

     } 

    } 

} 

当我尝试绘制wallData,总是有ExceptionError“对象引用未设置为对象的实例”。

回答

3

你的循环内您声明

var lay = doc.Element("map").Element("layer"); 

这是不必要的,因为你已经拥有了独特的层。您需要完全删除该行并使用foreach循环中的layer变量。在循环的内部现在看起来应该是这样

foreach (XElement layer in doc.Element("map").Descendants("layer")) 
{ 
    switch (layer.Attribute("name").Value) 
    { 
     case "background":  
      backgroundData = layer.Element("data").Value.Split(','); 
      break; 

     case "walls": 
      wallData = layer.Element("data").Value.Split(','); 
      break; 
    } 
} 

在代码中,你总是抓住同一层两次,而不是通过他们加强。

+0

谢谢,这工作 –

+0

向前并接受答案即可。如果你一直问问题而没有给出正确的答案,人们就会因此而烦恼 – Nevyn

+0

当然!对不起... –

2

您使用的是foreach遍历所有layer标签。但是在循环内部,你没有使用它们。相反,您总是通过doc.Element("map").Element("layer")访问第一层。

+0

太谢谢你了...这正是我的错误:d –

1

更换

var lay = doc.Element("map").Element("layer"); 

var lay = layer; 

你忽略了循环变量,而只使用第一个元素。

1

试试这个

public class LevelXmlReader 
{ 
    public string[] backgroundData; 
    public string[] wallData; 

    LevelXmlReader() 
    { 
     XDocument doc = XDocument.Load(@"Level/Level01.xml"); 
     foreach (XElement layer in doc.Element("map").Descendants("layer")) 
     { 
      var layName = layer.Attribute("name").Value; 
      switch (layName) 
      { 
       case "background": 
        backgroundData = layer.Element("data").Value.Split(','); 
        break; 

       case "walls": 
        wallData = layer.Element("data").Value.Split(','); 
        break; 
      } 
     } 
    } 
}