2014-01-20 3 views
1

Итак, я пытаюсь проанализировать XML-документ на C# с помощью класса XmlDocument. До сих пор я успешно загружал данные из первого узла, называемого <map>.Анализ XML с XmlDocument

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: Я не мог BLOCKQUOTE мой XML, так что я положил его на Pastebin: http://pastebin.com/qW967heQ

Edit2: В ответ на использовании LINQ; Я попробовал, но только что закончил с тем, что я не смог получить доступ к данным, полученным из XML, так как я уверен, что мог бы его зарегистрировать с обычным тегом {0}, но я не мог присвоить значение переменной. Я не слишком опытный, поэтому я сожалею, если мне кажется, что что-то не хватает.

+0

положить XML, чтобы помочь вам –

+0

Трудно сказать, что случилось с вашим кодом, не видя данные, которые вы пытаетесь разобрать –

+4

Какой 'foreach' цикл? У вас двое. Кроме того, у вас есть * для использования 'XmlDocument'? LINQ to XML намного проще. Если вы можете опубликовать образец XML и исправить форматирование кода, что тоже поможет. –

ответ

1

В цикле foreach вы получаете доступ к map.ChildNodes. Это возвращает узлы tileset, а также layer узлов. Затем вы пытаетесь получить доступ к свойству InnerText несуществующего атрибута firstgid узлов layer.

Вместо 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

Смежные вопросы