执行 linq to xml 多级“元素”的好方法查询时无需检查 null
我正在使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
本质上,你对问题分析过度了。
从这里开始:
这将返回
xe
的所有
子级的序列;这可能是一个空序列,但永远不会为空。现在,扩展到此:
这使用扩展方法
Elements()
(框架的一部分)来查找的所有
到目前为止您拥有的元素。
子级;一直向下重复此操作,直到找到具有值的元素。然后,使用强制转换来提取值:
同样,强制转换是由框架提供的。
所有对 null 的检查都已经由编写该框架的聪明的编码人员为您处理了 - 这是使
XDocument
和朋友们如此愉快地编写代码的很大一部分原因。Essentially, you're over analysing the problem.
Start with this:
this will return a sequence of all
<foo>
children ofxe
; this might be an empty sequence, but will never be null.Now, extend to this:
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:
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.可能需要稍微修改您的 valueOrDefault 扩展方法。基本思想:
might require modifying your valueOrDefault extension method a bit. Basic idea: