在 XDocument 中搜索 XML 节点时避免 Try n Catch
Posted
技术标签:
【中文标题】在 XDocument 中搜索 XML 节点时避免 Try n Catch【英文标题】:Avoid Try n Catch when searching for XML nodes in XDocument 【发布时间】:2020-11-29 21:49:31 【问题描述】:这是一种检查XDocument
文件中是否存在某些特定节点的方法。
显然基于某些文档可能会遇到一些NullExceptions。 (在第 5,6 行)
您推荐什么方式,如何更改这段代码以避免使用 Try/Catch 而不会出现异常?
var xContents = xDocument.Root.Descendants("Content");
if (xContents.Any())
doesIncludeThat =
xContents.Any(e => e.HasAttributes && e.Name == "Content"
&& e.Attribute("Include").Value == @"Happy New Year");
...
【问题讨论】:
(string)e.Attribute("Include") == @"Happy New Year"
可以。如果属性不存在,(string)
转换运算符将返回 null。
谢谢,会检查的。
@KlausGütter 你的意思是我用这个:(string)e.Attribute("Include").Value == ... ?
不,没有“.Value”。 XAttribute 有一组针对不同数据类型的强制转换运算符。
因为它给出了同样的错误,现在将删除该值。
【参考方案1】:
如果该属性不存在,您可以执行以下操作之一,而不是使用 e.Attribute(name).Value
,这将给出 NullReferenceException,在这种情况下两者都将返回 null:
e.Attribute(name)?.Value
或
(string)e.Attribute(name)
后者使用 XAttribute 中定义的转换(强制转换)运算符之一,如果属性不存在,它也会返回 null。
【讨论】:
克劳斯,谢谢你,这对我来说是新事物,虽然不是 100% 确定这是否是最好的方法,我是否最喜欢它,因为认为它有点hacky,也许还有许多其他方法也可以达到结果,但它奏效了,我从中吸取了教训,+1 并将其标记为答案。 哦,你提供了两种方法,第一种也不错。两者都很好。以上是关于在 XDocument 中搜索 XML 节点时避免 Try n Catch的主要内容,如果未能解决你的问题,请参考以下文章
XDocument 读取具有名称空间的根元素的 XML 文件