gpt4 book ai didi

c# - 使用 LINQ to XML 时避免暴露于 NullReferenceException

转载 作者:行者123 更新时间:2023-11-30 14:03:23 28 4
gpt4 key购买 nike

我正在使用对 XElement.Element() 方法的一系列调用来深入了解 XML 文档并提取属性值:

XElement root = ...;
XNamespace ns = "...";
var firstName =
root
.Element(ns + "Employee")
.Element(ns + "Identity")
.Element(ns + "Name")
.Attribute(ns + "FirstName");

但是,由于传入文档尚未经过架构验证,因此如果任何预期的中间元素不存在,格式错误的文档可能会导致 NullReferenceException

有没有办法避免这种风险,同时保持代码简洁?

我可以将上面的代码包装在 NullReferenceException 的处理程序中,但这感觉不对,而且也不会具体指出故障发生的位置。构建信息性错误消息将是手动的、乏味的、容易出错的并且存在维护风险。

我应该使用 XPath 吗?相反,这样我就可以检查是否有 null 返回,然后轻松构造一条错误消息,指示无法解析 XPath 表达式?

最佳答案

一种选择是使用 Elements() 而不是 Element() - 如果找不到该元素,它将产生一个空序列。使用 Extensions 中的扩展方法,您可以从元素序列 元素序列 - 属性也是如此。所以:

var firstName = 
root
.Elements(ns + "Employee")
.Elements(ns + "Identity")
.Elements(ns + "Name")
.Attributes(ns + "FirstName")
.FirstOrDefault();

请注意,这两个代码段之间存在差异 - 这将找到第一个匹配的属性,即使它来自(比方说)第二个 Employee 中的第三个 Identity 元素中的第一个 Name 元素元素。这对您来说可能是问题,也可能不是问题。

(只是想检查一下,您确实需要属性上的命名空间吗?与元素不同,属性不会继承“默认”命名空间。在命名空间上使用属性比在元素上使用属性要少见。)

关于c# - 使用 LINQ to XML 时避免暴露于 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4295738/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com