缺少节点导致linq到xml的空异常崩溃

时间:2010-01-21 18:14:21

标签: c# .net linq linq-to-xml

我得到了一个null异常,因为MYTAG1不存在。我理解这是因为Element(“MYTAG1”)为null并且调用Elements(“MYTAG2”)就不行了。

如何处理此问题以防止崩溃?

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

5 个答案:

答案 0 :(得分: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 :(得分: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                            
                       };

答案 2 :(得分: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 ... } );

答案 3 :(得分: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

,这将有所不同

答案 4 :(得分:0)

您可以在单个LINQ查询中使用单独的from子句和where子句完成所有操作。

var myItems = 
        from tag1 in Nodes.Elements("MYTAG1")
        where tag1 != null
        from tag2 in tag1.Elements("MYTAG2")
        select new EPTableItem
        {
        //    Assign stuff here                            
        };