所以我試圖用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}標記進行登錄,但我無法將該值分配給變量。我不是很有經驗,所以我很抱歉,如果我似乎錯過了一些明顯的東西。
把你的XML來幫助你 –
這很難說什麼是錯與您的代碼沒有看到數據,你試圖解析 –
哪個'foreach'循環?你有兩個。另外,你是否有*使用'XmlDocument'? LINQ to XML要簡單得多。如果您可以發佈XML示例並修復代碼格式,那也可以幫助您。 –