引用不存在的XML元素时出现NullReferenceException

时间:2017-03-12 22:53:22

标签: c# xml linq

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

  

类型' System.NullReferenceException'的第一次机会异常。   发生在Test.exe System.NullReferenceException:对象引用   没有设置为对象的实例。

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元素值(如果存在)转换为大写,以获得不区分大小写的比较。

我的印象是?? "~"意味着"如果左边是null,请使用右边的内容。因此,在这种情况下,x应该变为波浪号,因此不会对thisKeyword进行验证(因为它不包含波浪号)。我同意的粗略方法......但它甚至不起作用。

如何防止NullReferenceException?

1 个答案:

答案 0 :(得分: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)
相关问题