2015-09-11 2 views
0

У меня есть method, который анализирует файл XML.C# XML to linq error if null

Мой метод:

public static List<UpperLevelGPS> ParseXml(string Document) 
{ 
      List<UpperLevelGPS> result = new List<UpperLevelGPS>(); 
      result.Clear();          

      doc = XDocument.Load(Document); 

      result = (from n in doc.Descendants("level") 
         select new UpperLevelGPS() 
         { 
          CurrentLevel = int.Parse(n.Attribute("CurrentLevel").Value), 

          TeleNodes = (from l in n.Element("UpperLevelGPSs").Elements("UpperLevelGPS") 
             select new TeleNodes() 
             { 
              id = (int)(l.Attribute("id")), 
              UpperLevelGPSMapID = (int)l.Attribute("UpperLevelGPSMapID"), 
              DestinationMapID = (int)l.Attribute("DestinationMapID"), 
              HostelID = (int)l.Attribute("HostelID"), 
              x = (float)l.Attribute("x"), 
              y = (float)l.Attribute("y"), 
              z = (float)l.Attribute("z") 
             }).ToList() 
         }).ToList(); 

      return result; 
} 

Узел UpperLevelGPSs не существует ВСЕГДА мой XML файл, так что выше query не удается. Как я могу поймать и обработать событие null?

+3

Как насчет использования тернарного оператора '?'? 'a! = null? (int) a: 0; ' – Eser

+0

Можете ли вы показать, как это делается в моем коде? – user3787774

+0

О, я вижу, я ошибся в своем вопросе. Я имел в виду, что узел «UpperLevelGPSs» - это тот, который обычно не существует. – user3787774

ответ

0

Проверьте, если он делает перед LinQ даного:

public static List<UpperLevelGPS> ParseXml(string Document) 
    { 
      List<UpperLevelGPS> result = new List<UpperLevelGPS>(); 
      result.Clear();          

      doc = XDocument.Load(Document); 

      var upperLevelGPSs = n.Element("UpperLevelGPSs"); 

      if (upperLevelGPSs.Count > 0) 
      { 
       result = (from n in doc.Descendants("level") 
          select new UpperLevelGPS() 
          { 
           CurrentLevel = int.Parse(n.Attribute("CurrentLevel").Value), 

           TeleNodes = (from l in upperLevelGPSs .Elements("UpperLevelGPS") 
              select new TeleNodes() 
              { 
               id = (int)(l.Attribute("id")), 
               UpperLevelGPSMapID = (int)l.Attribute("UpperLevelGPSMapID"), 
               DestinationMapID = (int)l.Attribute("DestinationMapID"), 
               HostelID = (int)l.Attribute("HostelID"), 
               x = (float)l.Attribute("x"), 
               y = (float)l.Attribute("y"), 
               z = (float)l.Attribute("z") 
              }).ToList() 
          }).ToList(); 
      } 
      return result; 
} 

Примечание: Я не проверял это. Дайте мне знать, если у вас возникнут проблемы.

0
        { 
             id = (int)(l.Attribute("id")), 
             UpperLevelGPSMapID = (int?)l.Attribute("UpperLevelGPSMapID"), 
             DestinationMapID = (int)l.Attribute("DestinationMapID"), 
             HostelID = (int)l.Attribute("HostelID"), 
             x = (float)l.Attribute("x"), 
             y = (float)l.Attribute("y"), 
             z = (float)l.Attribute("z") 
            }).ToList() 
        }).ToList(); 

(Int?) Результат будет иметь значение null, если атрибут отсутствует.