在 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 文件

WPF 关于XDocument(xml) 的部分操作记录

如何将 Xml 属性绑定到 Treeview 节点,同时将 XDocument 数据绑定到 WPF Treeview

计算 XDocument 上的子节点

在 XDocument 中编辑特定元素

使用C#中的XDocument对DataGridView进行XML查询