【问题标题】:XElement NullReferenceExceptionXElement NullReferenceException
【发布时间】:2011-03-26 02:42:34
【问题描述】:

我有以下代码。

 XElement opCoOptOff = doc.Descendants(ns + "OpCoOptOff").FirstOrDefault();
 String opCo = opCoOptOff.Element(ns + "strOpCo").Value;

现在,如果我返回的元素为 null,我将收到 NullReferenceException,因为 XElement 为 null。所以我改成下面这样。

String opCo = opCoOptOff.Element(ns + "strOpCo").Value;
 if(opCoOptOff != null)
        {
String opCo = opCoOptOff.Element(ns + "strOpCo").Value;

我希望必须有一种更优雅的方法来执行此操作,因为这种情况经常出现,并且我希望避免每次出现问题时都进行此类检查。任何帮助将不胜感激

【问题讨论】:

  • “不是真的,只是检查空”是一个有效的答案吗?我认为我们工作的一个重要部分是空检查......

标签: linq nullreferenceexception xelement


【解决方案1】:

您可以写一个extension method 并在任何地方使用它:

public static class XDocumentExtension
{
   public static string GetSubElementValue(this XElement element, string item)
   {
        if(element != null && element.Value != null)
        {
           if (element.Element(item) != null)
           {
              return element.Element(item).Value;
           }
        }
        return null;
   }

   public static XElement GetElement(this XElement element, string item)
   {
        if (element != null)
            return element.Element(item);

        return null;
   }

   public static XElement GetElement(this XDocument document, string item)
   {
        if (document != null)
           return document.Descendants("item").FirstOrDefault();
        return null;
   }
}

将其用作:

String opCo = opCoOptOff.Element(ns + "strOpCo").GetSubElementValue(ns + "strOpCo");

您还可以根据需要添加其他扩展。

编辑:我已经更新了答案,但如果你在我写之前仔细阅读你可以add other extensions for your purpose.我写这个是因为我猜你可能想要调用空对象元素,我不'不知道你的确切情况是什么,但我添加了一些代码以进行更多说明,根据你的情况完成 XDocumentExtension 类,并且一个注释扩展方法可以在空对象上工作。

【讨论】:

  • 谢谢,但如果元素有效,我觉得这个答案有效。如果 opCoOptOff 为空,当我这样做时,我仍然会得到一个空引用异常。
  • 非常感谢。我意识到我遗漏了试图对空对象进行操作的附加代码。我想我应该能够从这里得到它。非常感谢您的帮助。
  • @Ken,关于扩展方法的重要一点是它们可以处理空对象(我之前说过),我建议您使用它进行验证以避免不必要的异常。
【解决方案2】:

您实际上可以将 XElement 直接转换为字符串: http://msdn.microsoft.com/en-us/library/bb155263.aspx

所以

String opCo = opCoOptOff.Element(ns + "strOpCo").Value;

可能

string opCo = (string) opCoOptOff.Element(ns + "strOpCo");

【讨论】:

  • 这是同样的问题,opCoOptOff 仍然会为空,抛出一个NRE
  • 是的,我的用法略有不同,我使用 Descendants(...).FirstOrDefault 访问元素是一行,然后直接将其转换为字符串。那会奏效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 2012-04-06
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多