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