2014-01-20 47 views
1

所以我試圖用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示例並修復代碼格式,那也可以幫助您。 –

回答

1

在foreach循環中,您訪問map.ChildNodes。這將返回tileset節點,但也會返回layer節點。然後嘗試訪問layer節點的不存在的firstgid屬性的InnerText屬性。

而不是map.ChildNodes您可以使用map.SelectNodes("tileset")篩選tileset節點。

+0

謝謝你幫助我。你有什麼線索可以在這裏閱讀更多信息嗎?我注意到我缺乏基礎知識。 –

1

可能是這個幫助你

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