很好的方法做linq到xml多级“元素”查询,而不必检查null

时间:2010-03-01 05:55:58

标签: null linq-to-xml

我正在使用xml片段,并发现我正在做很多事情:

dim x = xe.Element("foo").Element("bar").Element("Hello").Element("World").Value

但是我不能总是保证xml文档将包含foo或bar。有没有更好的方法来做这种事情而不必检查每个查询?

dim x = ""
if xe.Element("foo").Any() then
    if xe.Element("foo").Element("bar").Any() Then
        if xe.Element("foo").Element("bar").Element("Hello").Any() Then
            x = xe.Element("foo").Element("bar").Element("Hello").Element("World").ValueOrDefault()
        End If
    End If
End If

(ValueOrDefault是我添加的扩展方法)

2 个答案:

答案 0 :(得分:2)

基本上,你是在分析这个问题。

从这开始:

xe.Elements("foo")

这将返回<foo>所有xe个孩子的序列;这可能是一个空序列,但永远不会为空

现在,扩展到:

xe.Elements("foo")
    .Elements("bar")

这使用扩展方法Elements()(框架的一部分)来查找到目前为止<bar>元素的所有<foo>子元素。

重复此操作,直到找到带有值的元素。然后,使用强制转换来提取值:

dim x 
    = (string) xe.Elements("foo")
        .Elements("bar")
            .Elements("Hello")
                .Elements("World")
                    .FirstOrDefault()

同样,演员阵容由框架提供。

编写框架的智能编码器已经为您处理了所有对null的检查 - 这是使XDocument和朋友很好编码的重要部分。

答案 1 :(得分:0)

可能需要稍微修改valueOrDefault扩展方法。基本理念:

xe.Elements("foo").Elements("bar").Elements("Hello").Elements("World").FirstOrDefault();