用XmlDocument解析XML
所以我试图用XmlDocument类解析C#中的XML文档。到目前为止,我已经成功地从第一个节点加载数据,称为<map>
。用XmlDocument解析XML
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>
标签;所以在逻辑上我得出结论,我必须做一个循环(第一个)。
当我尝试编译并运行代码时,视觉工作室告诉我“NullReferenceException未处理”,同时指向foreach循环内的第一行。
那么这里发生了什么?
EDIT1:我不能大段引用我的XML,所以我把它放在引擎收录:http://pastebin.com/qW967heQ
EDIT2:在回答使用LINQ;我确实尝试过,但它只是以我无法访问从XML检索到的数据而告终,如确定我可以使用普通的{0}标记进行登录,但我无法将该值分配给变量。我不是很有经验,所以我很抱歉,如果我似乎错过了一些明显的东西。
在foreach循环中,您访问map.ChildNodes
。这将返回tileset
节点,但也会返回layer
节点。然后尝试访问layer
节点的不存在的firstgid
属性的InnerText
属性。
而不是map.ChildNodes
您可以使用map.SelectNodes("tileset")
筛选tileset
节点。
谢谢你帮助我。你有什么线索可以在这里阅读更多信息吗?我注意到我缺乏基础知识。 –
可能是这个帮助你
XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"D:\Map.xml");
parseXML(xDoc);
private void parseXML(XmlDocument xdoc) {
try {
var enumXMLnode = from xelement in xdoc.GetElementsByTagName("tileset").Cast<XmlElement>()
select xelement;
foreach (XmlElement innerData in enumXMLnode) {
MessageBox.Show(innerData.InnerXml);
}
}
catch {
}
}
你可以直接跳转到任何节点 – Dibu
把你的XML来帮助你 –
这很难说什么是错与您的代码没有看到数据,你试图解析 –
哪个'foreach'循环?你有两个。另外,你是否有*使用'XmlDocument'? LINQ to XML要简单得多。如果您可以发布XML示例并修复代码格式,那也可以帮助您。 –