C# GetElementByID.GetElementsByTagName返回null
我的朋友编写了这段XML代码,用于在我们的游戏中加载和写入保存数据时进行简单测试。问题是他的代码根本不起作用,我以前从未编写过任何XML代码,所以这对我来说是新的,我决定学习XML。 它只需要x和y值来创建新的平铺对象。 运行代码时,会出现以下错误: System.NullReferenceException未处理 HResult=-2147467261 Message=对象引用未设置为对象的实例 TL;DR It加载简单的平铺,它所寻找的只是x和y位置,以便稍后添加到在Level类中访问的列表中 他写的代码是:C# GetElementByID.GetElementsByTagName返回null,c#,xml,list,C#,Xml,List,我的朋友编写了这段XML代码,用于在我们的游戏中加载和写入保存数据时进行简单测试。问题是他的代码根本不起作用,我以前从未编写过任何XML代码,所以这对我来说是新的,我决定学习XML。 它只需要x和y值来创建新的平铺对象。 运行代码时,会出现以下错误: System.NullReferenceException未处理 HResult=-2147467261 Message=对象引用未设置为对象的实例 TL;DR It加载简单的平铺,它所寻找的只是x和y位置,以便稍后添加到在Level类中访问的列表
public class XmlHandler
{
private List<Base.Tile> tiles;
public XmlHandler()
{
}
public void Load()
{
XmlDocument documentFile = new XmlDocument();
documentFile.Load(@"C:\Tiles\0.xml");
var listOfTiles = documentFile.GetElementById("tiles").GetElementsByTagName("tile");
foreach(XmlElement tile in listOfTiles)
{
var x = ((XmlElement)tile.GetElementsByTagName("position")[0]).GetAttribute("x");
var y = ((XmlElement)tile.GetElementsByTagName("position")[0]).GetAttribute("y");
Classes.Base.Tile t = new Base.Tile(new Vector2(float.Parse(x), float.Parse(y)));
this.tiles.Add(t);
}
}
public List<Base.Tile> GetTiles()
{
return this.tiles;
}
}
当前XML文件,从原始文件修改而来,如下所示
<tiles>
<tile>
<position x="10" y="20" />
</tile>
<tile>
<position x="50" y="20" />
</tile>
<tile>
<position x="30" y="40" />
</tile>
</tiles>
这是我修改的原始XML,因为第一行导致了错误
<?xml encoding="utf-8"?>
<tiles>
<tile>
<id>1</id>
<position x="10" y="20" />
</tile>
<tile>
<id>2</id>
<position x="50" y="20" />
</tile>
<tile>
<id>3</id>
<position x="30" y="40" />
</tile>
</tiles>
感谢您的收看/阅读。感谢您的帮助 错误在这里:
var listOfTiles = documentFile.GetElementById("tiles").GetElementsByTagName("tile");
更改为:
var listOfTiles = documentFile.GetElementsByTagName("tiles").GetElementsByTagName("tile");
是一个标签,它没有任何id。错误在这里:
var listOfTiles = documentFile.GetElementById("tiles").GetElementsByTagName("tile");
更改为:
var listOfTiles = documentFile.GetElementsByTagName("tiles").GetElementsByTagName("tile");
是一个标记,但它没有任何id。我不确定这是否是完整的类,但首先,看起来您还没有为平铺创建列表 在开始向列表“tiles”添加tiles之前,您需要写下: 瓷砖=新列表 我建议建造师
了解null引用异常发生的位置也会很有帮助。确保您的列表已设置,然后如果问题仍然出现,请添加注释,我将在我的计算机上运行您的代码 我不确定这是否是完整的类,但首先,看起来您还没有为tiles创建列表 在开始向列表“tiles”添加tiles之前,您需要写下: 瓷砖=新列表 我建议建造师 了解null引用异常发生的位置也会很有帮助。确保您的列表已设置,然后如果问题仍然出现,请添加注释,我将在我的计算机上运行您的代码 根据,GetElementById将返回具有DTD中定义的id属性的元素,或者默认情况下仅返回id。您没有任何id属性,因此返回null-因此出现异常 如果将有问题的行更改为:
var listOfTiles = documentFile.GetElementsByTagName("tile");
那么您当前的代码就可以正常工作了。然而LINQ to XML是一种更干净的API,您可以按照以下方式编写整个方法:
var doc = XDocument.Load(@"C:\Tiles\0.xml");
var tiles =
from tile in doc.Descendants("tile")
from position in tile.Elements("position")
let x = (float)position.Attribute("x")
let y = (float)position.Attribute("y")
select new Base.Tile(new Vector2(x, y));
this.tiles = tiles.ToList();
根据,GetElementById将返回具有DTD中定义的id属性的元素,或者默认情况下仅返回id。您没有任何id属性,因此返回null-因此出现异常
如果将有问题的行更改为:
var listOfTiles = documentFile.GetElementsByTagName("tile");
那么您当前的代码就可以正常工作了。然而LINQ to XML是一种更干净的API,您可以按照以下方式编写整个方法:
var doc = XDocument.Load(@"C:\Tiles\0.xml");
var tiles =
from tile in doc.Descendants("tile")
from position in tile.Elements("position")
let x = (float)position.Attribute("x")
let y = (float)position.Attribute("y")
select new Base.Tile(new Vector2(x, y));
this.tiles = tiles.ToList();
Stefano是对的,但我建议用它来归档磁贴:documentFile.SelectNodes//tile;这将返回XML文件中任意位置的XML节点列表,这些节点称为平铺。这样,您就不必获取tiles元素,然后再从那里获取tiles。这样创建新的节点列表是不可能的。Stefano是对的,但我建议使用它来归档tiles:documentFile.SelectNodes//tile;这将返回XML文件中任意位置的XML节点列表,这些节点称为平铺。这样就省去了获取tiles元素,然后从那里获取tiles元素的麻烦。不可能创建这样的新节点列表。这解决了我所有的问题!谢谢。这解决了我所有的问题!非常感谢。