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

标签 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-) 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 时,总是出现异常错误“对象引用未设置为对象的实例。”

最佳答案

在你的循环中声明

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

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

关于c# - 如何在 C# 中切换 XML XDocument XElement 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14709922/

相关文章:

c# - 调用返回字符串数组的函数

c# - 在 WCF 中设置最大下载速度

c# - 如何在自定义目标之后运行构建后事件?

python - 当尝试使用 pythonnet 从脚本构建 exe 时,py2exe 失败并显示 "No module named ' clr'"

python - lxml 不执行 xslt 转换

c# - 即使使用相同的 key ,加密输出也总是不同

c# - 循环创建 MS Word 内容控件

c# - C# 模型的自定义 setter

xml - Bash 脚本使用 XMLStarlet 将 xml 元素解析为 key=value 对

Python Lxml(对象化): Checking whether a tag exists