GetElementByID.GetElementsByTagName returns null
本文关键字:null returns GetElementsByTagName GetElementByID | 更新日期: 2023-09-27 18:03:30
我的朋友编写了这段XML代码,用于在我们的游戏中进行加载和写入保存数据的简单测试。问题是他的代码根本不起作用,我以前从来没有写过任何XML代码,所以这对我来说是新的,我决定学习XML。它只需要x和y值来创建一个新的Tile对象。当运行代码时,它给出错误:
系统。NullReferenceException未处理
HResult = -2147467261
Message=对象引用未设置为对象的实例。
TL;DR它加载简单的tile,它所寻找的只是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>
感谢观看/阅读。任何帮助都是感激的!
bug在这里:
var listOfTiles = documentFile.GetElementById("tiles").GetElementsByTagName("tile");
这样修改:
var listOfTiles = documentFile.GetElementsByTagName("tiles").GetElementsByTagName("tile");
<tiles>
是一个标签,它没有任何id。
我不确定这是否是完整的类,但首先看起来您还没有为tile创建列表。
在开始向列表"tiles"添加tile之前,您需要写:
tiles = new List();
我建议使用构造函数。
了解空引用异常发生的位置也很有帮助。确保设置好列表,如果问题仍然存在,请添加注释,然后我将在我的机器上运行您的代码。
根据文档,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();