Отсутствующие узлы приводят к аварийному завершению с нулевым исключением linq to xml - PullRequest
3 голосов
/ 21 января 2010

Я получаю пустое исключение, потому что MYTAG1 не существует. Я понимаю, что это потому, что Элемент ("MYTAG1") является нулевым, и вызов элементов ("MYTAG2") для него не будет работать.

Как мне справиться с этим, чтобы предотвратить падение?

     var myItems = from myNode in Nodes.Element("MYTAG1").Elements("MYTAG2")
                           select new EPTableItem
                           {
                           //    Assign stuff here                            
                           };

Ответы [ 5 ]

2 голосов
/ 21 января 2010

Я не могу придумать умного способа включить оператор if в синтаксис запроса C #, поэтому я предложу следующее решение, которое проверяет наличие необходимого узла перед выполнением запроса.

var myItems;
XElement myTag1 = myNode.Element("MYTAG1");

if (myTag1 != null)
{
    myItems = from myNode in myTag1.Elements("MYTAG2")  
              select new EPTableItem  
              {  
                  //    Assign stuff here                              
              };  
}
1 голос
/ 21 января 2010

Я считаю, что Linq намного проще, когда вы используете методы расширения вместо псевдо-sql-синтаксиса. Вы должны быть в состоянии сделать что-то в этом духе, но помните, что я не проверял код.

var myItems = Nodes.Where(n => n.Element("MYTAG1") != null)
   .Select(n => n.Element("MYTAG1"))
   .Select(elem => elem.Elements("MYTAG2"))
   .Select(elem2 => new EPTTableItem { something = elem2.SomeProperty ... } );
1 голос
/ 21 января 2010

Один из вариантов - определить новый метод расширения и использовать его в качестве источника запроса.

static IEnumerable<XElement> ElementAndChildren(this XElement parent, string name, string childName) 
{
    var element = parent.Element(name);
    if (element == null)
    {
        return Enumerable.Empty<XElement>();
    }
    return element.Elements(childName);
}

...
var myItems = from myNode in Nodes.ElementAndChildren("MYTAG1","MYTAG2")
                       select new EPTableItem
                       {
                       //    Assign stuff here                            
                       };
0 голосов
/ 21 января 2010

Вы можете сделать все это в одном запросе LINQ с отдельными предложениями и предложением where.

var myItems = 
        from tag1 in Nodes.Elements("MYTAG1")
        where tag1 != null
        from tag2 in tag1.Elements("MYTAG2")
        select new EPTableItem
        {
        //    Assign stuff here                            
        };
0 голосов
/ 21 января 2010

Если вы хотите сделать это в LINQ, примерно так должно работать:

var myItems = from node in (from myNode in Nodes.Elements("MYTAG1")
              where myNode != null
              select myNode).SelectMany(x => x.Elements("MYTAG2"))
              select new EPTableItem
              {
                // Assign stuff here                            
              };

конечно, это будет работать по-другому, если есть больше случаев MYTAG

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...