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>

感谢观看/阅读。任何帮助都是感激的!

GetElementByID.GetElementsByTagName returns null

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();