【发布时间】:2014-01-20 16:09:06
【问题描述】:
所以我尝试使用 XmlDocument 类在 C# 中解析 XML 文档。到目前为止,我已经成功地能够从名为<map> 的第一个节点加载数据。
public void read()
{
XmlDocument doc = new XmlDocument();
doc.Load("C:\\map.xml");
parseMap(doc);
}
private void parseDoc(XmlDocument doc)
{
XmlNode map = doc.DocumentElement.SelectSingleNode("/map");
int mapWidth = Convert.ToInt16(map.Attributes["width"].InnerText);
int mapHeight = Convert.ToInt16(map.Attributes["height"].InnerText);
int tileWidth = Convert.ToInt16(map.Attributes["tilewidth"].InnerText);
int tileHeight = Convert.ToInt16(map.Attributes["tileheight"].InnerText);
Console.Write("Map width: " + mapWidth + "\nMap height: " + mapHeight +
"\nTile width: " + tileWidth + "\nTile height: " + tileHeight);
int tilesetsCount = map.SelectNodes("tileset").Count;
Console.Write("\nAmount of tilesets: " + tilesetsCount);
foreach (XmlNode tileset in map.ChildNodes)
{
int firstgid = Convert.ToInt16(tileset.Attributes["firstgid"].InnerText);
string name = tileset.Attributes["name"].InnerText;
int tilesetTileWidth = Convert.ToInt16(tileset.Attributes["tilewidth"].InnerText);
int tilesetTileHeight = Convert.ToInt16(tileset.Attributes["tileheight"].InnerText);
foreach(XmlNode image in tileset.ChildNodes)
{
imageWidth = Convert.ToInt16(image.Attributes["width"].InnerText);
imageHeight = Convert.ToInt16(image.Attributes["height"].InnerText);
}
List<Tileset> tilesetList = new List<Tileset>();
tilesetList.Add(new Tileset(firstgid, name, tilesetTileWidth, tilesetTileHeight,
imageWidth, imageHeight));
}
}
但后来我遇到了一个问题,我的 XML 文档将包含几个 <tileset> 标签;所以逻辑上我得出结论我必须做一个循环(第一个)。
当我尝试编译和运行代码时,Visual Studios 告诉我一个 “NullReferenceException 未处理”,同时指向 foreach 循环内的第一行。
那么这里发生了什么?
Edit1:我无法阻止引用我的 XML,所以我把它放在了 pastebin:http://pastebin.com/qW967heQ
Edit2:回复使用 LINQ;我确实尝试过,但结果是我无法访问从 XML 中检索到的数据,就像我可以使用普通的 {0} 标记记录它一样,但我无法将值分配给变量。我不是很有经验,所以如果我似乎遗漏了一些明显的东西,我很抱歉。
【问题讨论】:
-
把你的xml来帮你
-
如果没有看到您尝试解析的数据,很难判断您的代码出了什么问题
-
哪个
foreach循环?你有两个。另外,你有使用XmlDocument吗? LINQ to XML 要简单得多。如果您可以发布 XML 示例并修复您的代码格式,那也会有所帮助。 -
不仅如此,您还在“第一行”中塞入了太多杂乱无章的代码,以至于有几个地方可能会出现空引用异常。让我给你一个提示。不要将这么多代码塞进这样的嵌套表达式中。这使得调试变得困难。
-
在约翰逊之前我没有想过这个问题,谢谢你的提示。但我仍然不知道如何解决这个问题。我添加了我的 XML 代码并修复了格式。