用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}标记进行登录,但我无法将该值分配给变量。我不是很有经验,所以我很抱歉,如果我似乎错过了一些明显的东西。

+0

把你的XML来帮助你 –

+0

这很难说什么是错与您的代码没有看到数据,你试图解析 –

+4

哪个'foreach'循环?你有两个。另外,你是否有*使用'XmlDocument'? LINQ to XML要简单得多。如果您可以发布XML示例并修复代码格式,那也可以帮助您。 –

在foreach循环中,您访问map.ChildNodes。这将返回tileset节点,但也会返回layer节点。然后尝试访问layer节点的不存在的firstgid属性的InnerText属性。

而不是map.ChildNodes您可以使用map.SelectNodes("tileset")筛选tileset节点。

+0

谢谢你帮助我。你有什么线索可以在这里阅读更多信息吗?我注意到我缺乏基础知识。 –

可能是这个帮助你

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 { 

     } 
    } 
+0

你可以直接跳转到任何节点 – Dibu