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

2

У меня есть дьявол времени, выбирая значение одного элемента в документе 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 = (from e in mySettings.Descendants( "Настройки" ) Строка 36:
Выбрать e.Element( "AttachmentsPath" )) SingleOrDefault() Значение..; Строка 37:

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

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

Теги:
linq-to-xml

7 ответов

3

Так как "MySettings" - это корень node, у него нет потомка под названием "MySettings"

попробовать

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

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

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

            if(AttachmentsPathElement != null)
            {
                AttachmentsPath = AttachmentsPathElement.Value;
            }
2

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

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

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

Что это...

string attachmentsPath= mySettings.Root.Element("MySettings")
                .Elements("AttachmentsPath").SingleOrDefault().Value;
1

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

SingleOrDefault().Value

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

 XElement mySettings = XElement.Load("MySettings.xml");
 string AttachmentsPath = mySettings.Element("AttachmentsPath").Value;
  • 0
    это не должно возвращать ноль. Учитывая XML, я только что дал вам выше.
  • 2
    @ Боже, не в этом дело. Вы не должны пытаться получить доступ к каким-либо свойствам или методам после вызова SingleOrDefault () без предварительной проверки, имеет ли оно значение null. В любом коде это плохая практика.
Показать ещё 1 комментарий
0

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

  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

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

0

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

Вы можете попробовать следующее:

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

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

Ещё вопросы

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