2010-01-21 63 views
3

我得到一个null异常,因为MYTAG1不存在。我明白这是因为元素(“MYTAG1”)为空,并调用元素(“MYTAG2”)在它上面不会工作。缺少节点导致null异常崩溃linq到xml

我该如何处理这个问题以防止崩溃?

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

回答

2

我想不出一个聪明的方法,将一个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

一个选项是定义一个新的扩展方法,并将其用作查询源。

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        
         }; 
1

我发现使用扩展方法代替伪sql语法时,Linq会容易得多。你应该能够按照这些方法做一些事情,但是请记住,我没有测试代码。

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 ... }); 
+0

您的第二个选择不会返回IEnumerable >吗? – 2010-01-21 18:52:09

+0

我在查询XElement.Element()而不是节点。原来,XElement没有Where扩展方法 – zachary 2010-01-22 15:29:19

0

如果你想这样做的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

的多次出现
0

你可以做到这一切在一个单独的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

这没有编译 – zachary 2010-01-22 21:23:46

+0

zachary,我编辑了代码示例,它在第一个元素上缺少s。 – 2010-01-23 03:56:30