XElement NullReferenceException

У меня есть следующий код.

 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;

Я надеюсь, что должен быть более элегантный способ сделать это, так как этот сценарий возникает часто, и я хотел бы избежать выполнения этого типа проверки каждый раз, когда возникает проблема. Будем очень благодарны любой помощи


person Ken    schedule 16.01.2011    source источник
comment
Не правда ли, просто проверить на нуль правильный ответ? Я думаю, что значительная часть нашей работы - это нулевые проверки...   -  person Kobi    schedule 16.01.2011


Ответы (2)


Вы можете написать 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, и методы расширения одного примечания могут работать с нулевыми объектами.

person Saeed Amiri    schedule 16.01.2011
comment
Спасибо, но я чувствую, что этот ответ работает, если элемент действителен. Когда я делаю это, если opCoOptOff имеет значение null, я все равно получаю исключение nullreferenceexception. - person Ken; 16.01.2011
comment
Большое спасибо. Я понимаю, что пропустил дополнительный код, который пытался работать с нулевым объектом. Я думаю, я должен быть в состоянии получить это отсюда. Большое вам спасибо за вашу помощь. - person Ken; 17.01.2011
comment
@Ken, одна важная вещь в методах расширения заключается в том, что они могут работать с нулевыми объектами (я говорил об этом ранее), и я предлагаю вам использовать его для проверки, чтобы избежать нежелательных исключений. - person Saeed Amiri; 17.01.2011

Фактически вы можете преобразовать XElement непосредственно в строку: http://msdn.microsoft.com/en-us/library/bb155263.aspx

so

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

может быть

string opCo = (string) opCoOptOff.Element(ns + "strOpCo");
person mark w    schedule 25.03.2011
comment
Это та же проблема, opCoOptOff по-прежнему будет нулевым, выдавая NRE - person jb.; 25.03.2011
comment
да, мое использование немного отличается: я обращаюсь к элементу в одну строку, используя Descendants(...).FirstOrDefault, а затем напрямую привожу это к строке. Это будет работать. - person mark w; 26.03.2011