Почему при попытке получить доступ к атрибуту в LINQ-to-XML возникает ошибка?

2

Согласно моей книге LINQ, этот слегка измененный пример должен работать.

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

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-документ?
Теги:
linq
linq-to-xml

2 ответа

4
Лучший ответ

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

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

или

XElement element = xdoc.Descendants("firstName").FirstOrDefault();
  • 0
    Согласен, но почему он выдает исключение в следующей строке кода, а не в этой?
  • 0
    Потому что в следующей строке элемент кода был нулевым. Если элемент не существует, исключение не выдается (в xdoc.Element ("firstName")).
Показать ещё 1 комментарий
2

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню