2009-08-05 1 views
2

Согласно моей книге LINQ, этот слегка измененный пример должен работать.Почему попытка получить доступ к атрибуту в LINQ-to-XML дает мне ошибку?

Почему это говорит мне "Ссылка на объект не установлена ​​в экземпляр объекта"?

using System; 
using System.Xml.Linq; 

namespace TestNoAttribute 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      XDocument xdoc = new XDocument(
       new XElement("employee", 
        new XAttribute("id", "23"), 
        new XElement("firstName", new XAttribute("display", "true"), "Jim"), 
        new XElement("lastName", new XAttribute("display", "false"), "Smith"))); 

      XElement element = xdoc.Element("firstName"); 
      XAttribute attribute = element.Attribute("display"); //error 

      Console.WriteLine(xdoc); 

      Console.ReadLine(); 

     } 
    } 
} 

Частичный ответ:

Я понял, если я изменю XDocument к XElement, то он работает. Может ли кто-нибудь объяснить почему?

+0

Не могли бы вы также разместить свой XML-документ? –

ответ

4

Доступ к дочернему элементу xdoc, который не существует. Попробуйте один уровень вниз:

XElement element = xdoc.Element("employee").Element("firstName"); 

или

XElement element = xdoc.Descendants("firstName").FirstOrDefault(); 
+0

Согласен, но почему он генерирует исключение на следующей строке кода, а не на этом? –

+0

Потому что в следующей строке элемента кода было null. Если элемент не существует, исключение не генерируется (в xdoc.Element ("firstName")). –

+0

ОК, я понял. –

2

См this на MSDN, почему. В нем явно объясняется их «идиома» о том, почему они чувствовали, что возвращают нулевой элемент, когда имя не найдено, было полезно.

Смежные вопросы