LINQ to XML:处理不存在的节点?

one*_*ney 3 c# xml linq linq-to-xml

这可能是一个简单的修复(好吧,它可能是)但由于某种原因我无法弄明白.

所以,我有一些看起来像这样的xml:

XElement xml = XElement.Parse (
@"<Alphabet>
     <a name="A" />
     <b name="B" />
     <d name="D" />
     <e name="E" />
</Alphabet>");
Run Code Online (Sandbox Code Playgroud)

所以稍后在我的代码中,我引用一个可能存在或不存在的节点,如下所示:

var name = (from b in xml.Descendants("c")
            select b.Attribute("name")).FirstOrDefault().Value;
Run Code Online (Sandbox Code Playgroud)

但是当它不存在时,不是返回null或""而是抛出NullReferenceException:对象引用未设置为对象的实例.

在我的linq查询中检查并查看节点是否实际存在的最佳方法是什么?或者我需要检查它是否存在其他方式?

Jon*_*eet 5

好吧,你正在选择属性 - 所以只需使用:

var nameAttribute = xml.Descendants("c").Select(b => b.Attribute("name"))
                                        .FirstOrDefault();
if (nameAttribute != null)
{
    string name = nameAttribute.Value;
}
else
{
    // Whatever...
}
Run Code Online (Sandbox Code Playgroud)

(我已经将它从查询表达式更改为点表示法,因为查询很简单 - 查询表达式语法实际上并没有给你带来任何东西.)

这个解决方案的一个问题是:它没有区分存在"c"元素但它没有"name"属性,并且首先没有"c"元素.你需要能分辨出来吗?

  • @Dave:而不是使用`Value`属性,将整个表达式转换为`string` - 如果用`null`参数调用,`XAttribute`显式转换为`string`返回`null`. (2认同)