如何在Linq To Xml中保护Null Reference异常?

前端之家收集整理的这篇文章主要介绍了如何在Linq To Xml中保护Null Reference异常?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <pages>
  3. <page id="56">
  4. <img id="teaser" src="img/teaser_company.png"></img>
  5. </page>
  6. </pages>

我有一个xml文件为cms内的页面定义了额外的资源.使用LinqToXml查询文件时,最好的方法来保护Null Reference异常?

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

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

编辑:很久以前,这是很清楚的 – 这些天我一定会按照伊戈尔的回答与演员一起去.

最简单的方法是:

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

或者,您可以向XElement编写扩展方法

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

然后使用:

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

或使用点符号:

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

(事先调用tabId.ToString(),btw而不是每次迭代都是有意义的.)

猜你在找的XML相关文章