【问题标题】:NullReferenceException when referencing an XML Element that doesn't exist引用不存在的 XML 元素时出现 NullReferenceException
【发布时间】:2017-03-12 22:53:21
【问题描述】:

我在尝试使用 linq 访问不存在的 XML 元素时收到以下错误:

“System.NullReferenceException”类型的第一次机会异常 发生在 Test.exe System.NullReferenceException: Object reference 未设置为对象的实例。

bool exists = website.Parent
            .Element("Exclusions")
            .Elements("Exclusion")
            .Where(x => thisKeyword.ToUpper().Contains((string)x.Value.ToUpper() ?? "~"))
            .Any();

我可以通过简单地使用.Where(x => thisKeyword.Contains((string)x))来解决这个问题

但我需要将thisKeyword 和 XML 元素值(如果存在)都转换为大写,以便进行不区分大小写的比较。

我的印象是?? "~" 的意思是“如果左边是空的,则使用右边的。所以在这种情况下,x 应该变成波浪号,因此不能针对 thisKeyword 进行验证(因为它永远不会包含波浪号)。我同意这种粗略的方法……但它甚至不起作用。

如何防止出现 NullReferenceException?

【问题讨论】:

  • 看看什么是null,thisKeyword,x,或者x.Value会杀了你。必须先做一个空检查。
  • 我认为您可以使用以下代码thisKeyword?.ToUpper().Contains((string)x?.Value.ToUpper() ?? "~") 来检查两者都不为空

标签: c# xml linq


【解决方案1】:

假设x.Value 为空且thisKeyword 已知为非空:

发生崩溃是因为?? 运算符试图检查ToUpper() 返回的值是否为空。但是它不能调用ToUpper(),因为x.Value不存在。

在 C# 版本 6 或更高版本中,您可以使用 null 传播运算符?.,当且仅当对象为非 null 时才会访问属性:

.Where(x => thisKeyword.ToUpper().Contains(
            (string)x.Value?.ToUpper() ?? "~")

或者,只需使用单独的Where 子句来检查x.Value 是否为非空:

.Where(x => x.Value != null)
.Where(x => thisKeyword.ToUpper().Contains(x.Value.ToUpper())

顺便说一句,您可以将条件放在Any() 子句中:

.Elements("Exclusion")
.Any(x => x.Value != null && thisKeyword.ToUpper().Contains(x.Value.ToUpper())

而且您也不一定需要转换为大写:

.Any(x => x.Value != null &&
          thisKeyword.IndexOf(x.Value,
             StringComparison.InvariantCultureIgnoreCase) > 0)

【讨论】:

  • 你在正确的轨道上,但你可以使用更简单的东西而不是使用 Elvis 运算符 - string.Equals(string, string, comparisonType) 静态方法。它可以容忍空值,你可以指定一个不区分大小写的检查(这是人们在检查之前执行 ToUpper() 或 ToLower() 的最常见原因)。
  • 谢谢。看起来我不能使用价值?。属性,所以我必须使用旧版本的 C#。我的下一个问题是如果 .Elements("Exclusion") 和 .Element("Exclusions") 在 XML 中不存在,我应该如何处理 NullReferenceException?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多