Почему я не могу выбрать один элемент в LINQ-To-XML? - PullRequest
2 голосов
/ 06 января 2010

У меня дьявольское время, когда я выбираю значение одного элемента в моем XML-документе

Мой документ выглядит как

<?xml version="1.0" encoding="utf-8" ?>
<MySettings>
  <AttachmentsPath>Test</AttachmentsPath>
  <PendingAttachmentsPath>Test2</PendingAttachmentsPath>
</MySettings>

Я пытался сделать следующее:

 XElement mySettings = XElement.Load("MySettings.xml");

 string AttachmentsPath = (from e in mySettings.Descendants("MySettings")
                              select e.Element("AttachmentsPath")).SingleOrDefault().Value;

или

 XElement mySettings = XElement.Load("MySettings.xml");

     string AttachmentsPath = mySettings.Element("AttachmentsPath").Value;

И ни одна из этих работ. Я продолжаю получать:

Ссылка на объект не установлена ​​на экземпляр объекта. Описание: Ан необработанное исключение произошло во время выполнение текущей сети запрос. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и откуда оно взято в коде.

Сведения об исключении: System.NullReferenceException: объект ссылка не установлена ​​на экземпляр объект.

Ошибка источника:

Строка 33:
x => x.Type); Строка 34: Строка 35:
AttachmentsPath = (от e в mySettings.Descendants ( "Настройки") Строка 36:
Выбрать e.Element ( "AttachmentsPath")) SingleOrDefault () Значение..; Строка 37:

Я вижу, что он правильно загружен в документ XML.

Что я делаю неправильно, пытаясь получить доступ к этому единственному значению настроек в моем XML-документе? Какой путь правильный?

Ответы [ 7 ]

3 голосов
/ 07 января 2010

Поскольку «MySettings» является корневым узлом, у него нет потомка с именем «MySettings»

попробовать

 var AttachmentsPath = (from e in mySettings.Descendants("AttachmentsPath")
                               select e).SingleOrDefault().Value;

однако, поскольку SingleOrDefault возвращает ноль, если нет узла, возможно, вы можете попробовать это как более безопасный

var AttachmentsPathElement = (from e in mySettings.Descendants("AttachmentsPath")
                               select e).SingleOrDefault();

            if(AttachmentsPathElement != null)
            {
                AttachmentsPath = AttachmentsPathElement.Value;
            }
2 голосов
/ 07 января 2010

Это работает.

string path = mySettings.Element("AttachmentsPath").Value;
1 голос
/ 22 июня 2012

Вы были почти там, все, что вам нужно сделать, это указать корневой элемент, в котором находится AttachmentPath.

Вот и все ...

string attachmentsPath= mySettings.Root.Element("MySettings")
                .Elements("AttachmentsPath").SingleOrDefault().Value;
1 голос
/ 07 января 2010

Это неверный код, по умолчанию класс равен null, если возвращается значение по умолчанию, вы получите исключение нулевой ссылки.

SingleOrDefault().Value

Во-вторых, если ваш второй подход не работает, это, скорее всего, означает, что вы не можете правильно загрузить файл XML или не можете найти элемент "AttachmentsPath" в XML.

 XElement mySettings = XElement.Load("MySettings.xml");
 string AttachmentsPath = mySettings.Element("AttachmentsPath").Value;
0 голосов
/ 07 января 2010

Пожалуйста, попробуйте таким образом. Я проверил этот код, он работает нормально

  XDocument xmlDoc = XDocument.Load(fileName);

    XElement page = xmlDoc.Descendants("MySettings").FirstOrDefault();

   string AttachmentsPath  =  page.Descendants("AttachmentsPath").First().Value;

   string PendingAttachmentsPath=  page.Descendants("PendingAttachmentsPath").First().Value;
0 голосов
/ 07 января 2010

Почему вы загружаете документ в XElement? Почему не XDocument?

Вы можете попробовать это:

XDocument mySettings = XDocument.Load("MySettings.xml");

string AttachmentsPath = mySettings.Root.Element("AttachmentsPath").Value;
0 голосов
/ 07 января 2010

Я просто имел дело с чем-то вроде этого пару часов назад. Оказалось, что элемент, который я искал, не существует. Возможно ли, что в вашем документе нет элемента «Настройки»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...