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



我知道,这个话题有很多帖子,但由于我在帖子中读了两天,没有任何效果,我决定在这里提问。我有一个类似的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>

这是一个有不同图层的(平铺)地图,我想在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"Object reference not set to a instance of a Object"(对象引用未设置为对象的实例)。

在循环中声明

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

在你的代码中,你总是两次都抓住同一层,而不是穿过它们。

您正在使用foreach来迭代所有layer标记。但在循环中,您没有使用它们。相反,您总是通过doc.Element("map").Element("layer")访问第一层。

更换

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

带有

var lay = layer;

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

试试这个

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

相关内容

  • 没有找到相关文章

最新更新