C# GetElementByID.GetElementsByTagName返回null

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类中访问的列表

我的朋友编写了这段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元素的麻烦。不可能创建这样的新节点列表。这解决了我所有的问题!谢谢。这解决了我所有的问题!非常感谢。