У меня есть дьявол времени, выбирая значение одного элемента в документе 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-документе? Каким образом это правильный способ?
Так как "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;
}
Это работает.
string path = mySettings.Element("AttachmentsPath").Value;
Вы были почти там, все, что вам нужно сделать, это указать корневой элемент, в котором находится AttachmentPath.
Что это...
string attachmentsPath= mySettings.Root.Element("MySettings")
.Elements("AttachmentsPath").SingleOrDefault().Value;
Это неправильный код, значение по умолчанию для класса равно null
, если по умолчанию возвращается, вы получите исключение с нулевой ссылкой.
SingleOrDefault().Value
Во-вторых, если ваш второй подход не работает, скорее всего, вы не можете правильно загрузить XML файл или не можете найти элемент "AttachmentsPath" в XML.
XElement mySettings = XElement.Load("MySettings.xml");
string AttachmentsPath = mySettings.Element("AttachmentsPath").Value;
Пожалуйста, попробуйте этот путь. Я проверил этот код, работая нормально
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;
Я пару дней назад общался с чем-то вроде этого. Оказалось, что элемент, который я искал, не существовал. Возможно ли, что у вас нет элемента с именем "Настройки" в документе?
Почему вы загружаете документ в XElement? Почему не XDocument?
Вы можете попробовать следующее:
XDocument mySettings = XDocument.Load("MySettings.xml");
string AttachmentsPath = mySettings.Root.Element("AttachmentsPath").Value;