xml - 您如何在 Linq To Xml 中防范 Null Reference 异常?

标签 xml linq exception-handling linq-to-xml

<?xml version="1.0" encoding="utf-8" ?>
<pages> 
  <page id="56">
    <img id="teaser" src="img/teaser_company.png"></img>
  </page>  
</pages>

我有一个 xml 文件,它为 cms 中的页面定义了额外的资源。使用 LinqToXml 查询此文件时,防止空引用异常的最佳方法是什么?

var page = (from tabElement in extensionsDoc.Descendants("page")
where tabElement.Attribute("id").Value == tabId.ToString()
select tabElement).SingleOrDefault();

如果页面元素没有名为“id”的属性,此代码可能会触发 Null Reference 异常。我必须使用 try catch block 还是有办法处理这个问题?例如,如果页面元素没有名为“id”的属性,则页面对象返回 null。

最佳答案

编辑:这显然是很久以前写的 - 这些天我肯定会按照 Igor 的回答与 Actor 一起去。

最简单的方法是这样的:

var page = (from tabElement in extensionsDoc.Descendants("page")
            let idAttribute = tabElement.Attribute("id")
            where idAttribute != null 
                  && idAttribute.Value == tabId.ToString()
            select tabElement).SingleOrDefault();

或者,您可以为 XElement 编写一个扩展方法:

public static string AttributeValueOrDefault(this XElement element,
                                             string attributeName)
{
    XAttribute attr = element.Attribute(attributeName);
    return attr == null ? null : attr.Value;
}

然后使用:

var page = (from element in extensionsDoc.Descendants("page")
            where element.AttributeValueOrDefault("id") == tabId.ToString()
            select element).SingleOrDefault();

或者使用点符号:

var page = extensionsDoc.Descendants("page")
             .Where(x => x.AttributeValueOrDefault("id") == tabId.ToString())
             .SingleOrDefault();

(预先调用一次 tabId.ToString() 是有意义的,顺便说一句,而不是每次迭代都调用。)

关于xml - 您如何在 Linq To Xml 中防范 Null Reference 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/792919/

相关文章:

xml - 如何使用 XML API 获取 Jenkins 作业列表

html - HTML 是否符合 XML 规范?

xml - 在 AS3 中使用 E4X 读取非标准命名空间 XML?

scala - 为什么在 Scala 中应该更喜欢 Option 进行错误处理而不是异常?

java - 在 finally block 中设置 reference = null?

php - 如何将内容整齐地保存到文件中?

c# - Linq 子选择

c# - 如何从 IQueryable.GroupBy 中选择最新日期?

C# Linq Where 和 Regex

jsf - 如何避免jsf中的BusyConversationException