执行 linq to xml 多级“元素”的好方法查询时无需检查 null

发布于 2024-08-23 06:34:02 字数 577 浏览 3 评论 0原文

我正在使用 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是我添加的扩展方法)

I'm working with an xml fragment, and finding that I'm doing the following a lot:

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

however I can't always guarantee that the xml document will contain foo or bar. Is there a nicer way to do this sort of thing without having to null check every query?

i.e.

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 is an extension method I've added)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

何以畏孤独 2024-08-30 06:34:02

本质上,你对问题分析过度了。

从这里开始:

xe.Elements("foo")

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

现在,扩展到此:

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

这使用扩展方法 Elements() (框架的一部分)来查找 的所有 子级; 到目前为止您拥有的元素。

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

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

同样,强制转换是由框架提供的。

所有对 null 的检查都已经由编写该框架的聪明的编码人员为您处理了 - 这是使 XDocument 和朋友们如此愉快地编写代码的很大一部分原因。

Essentially, you're over analysing the problem.

Start with this:

xe.Elements("foo")

this will return a sequence of all <foo> children of xe; this might be an empty sequence, but will never be null.

Now, extend to this:

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

This uses extension method Elements() (part of the framework) to look for all <bar> children of the <foo> elements you have so far.

Repeat this the whole way down, until you find the element with a value. Then, use a cast to extract the value:

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

Again, the cast is provided by the framework.

All of the checking for null is already handled for you by the smart coders who wrote the framework - this is a large part of what makes XDocument and friends so nice to code with.

梦初启 2024-08-30 06:34:02

可能需要稍微修改您的 valueOrDefault 扩展方法。基本思想:

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

might require modifying your valueOrDefault extension method a bit. Basic idea:

xe.Elements("foo").Elements("bar").Elements("Hello").Elements("World").FirstOrDefault();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文