如何在C#中的XML XDocument XElement中切换属性

时间:2013-02-05 14:32:32

标签: c# .net xml linq linq-to-xml

我知道,这个话题有很多帖子,但是由于我在帖子中看了两天而没有任何效果,我决定在这里问一下。 我有一个像这样的XML(Level01.xml)文件

<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>

它是一个具有不同图层的(tile-)地图,我想在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“对象引用未设置为对象的实例。”

4 个答案:

答案 0 :(得分: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;
    }
}

在你的代码中,你总是两次抓住同一层,而不是单步执行它们。

答案 1 :(得分:2)

您正在使用foreach来迭代所有layer个代码。但是在循环内部,你没有使用它们。相反,您始终通过doc.Element("map").Element("layer")访问第一个图层。

答案 2 :(得分:1)

替换

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

var lay = layer;

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

答案 3 :(得分: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;
            }
        }
    }
}