<?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”的属性,则此代码可能会触发空引用异常。我必须使用 try catch 块还是有办法处理这个问题?例如,如果页面元素没有名为“id”的属性,则为页面对象返回 null。
最佳答案
编辑:这显然是很久以前写的——这些天我肯定会按照伊戈尔的回答选择 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 中的空引用异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/792919/