Как правильно извлечь значение из одного вложенного XElement?

Чтобы восстановить значение вложенного XElement, в моем коде есть следующее:

XElement xml = new XElement("UserDefinedSettings", new XElement("RootFolder", new XElement("FolderName", "User Input Goes Here")));

xml.Save("UserDefinedSettings.xml");

Что дает мне это сохранено на жесткий диск:

<?xml version="1.0" encoding="utf-8"?>
<UserDefinedSettings>
  <RootFolder>
    <FolderName>User Input Goes Here</FolderName>
  </RootFolder>
</UserDefinedSettings>

Позже, чтобы получить имя папки, которую выбрал пользователь, я использую:

XDocument xdoc = XDocument.Load("UserDefinedSettings.xml");

var myVar = xdoc.Descendants("FolderName").Single();

textBox1.Text = myVar.Value;

Я новичок в Linq-XML, и мне интересно, правильно ли я поступил?

Первоначально я использовал следующую строку кода для получения имени папки, но я знал, что должен быть лучший способ, и после поиска здесь в SO примеров, я использую приведенный выше код.

string s =xdoc.Element("UserDefinedSettings").Element("RootFolder").Element("FolderName").Value;

2 ответа

Решение

То, что у вас есть, должно быть в порядке (новый способ), если вы уверены, что эти элементы существуют. Это рискует вызвать исключение нулевой ссылки, однако, если какой-либо из них не существует. Я обычно делаю запросы с Elements(), а не Element(). Elements() возвращает IEnumerable, который вы можете безопасно соединить вместе с другими запросами Elements() (или чем-то еще). Например, вы можете рассмотреть:

var folder = (string)xdoc.Elements("UserDefinedSettings").Elements("RootFolder").Elements("FolderName").FirstOrDefault();

Еще одна вещь, которую я обычно делаю, когда мне нужно, чтобы значение из атрибута или элемента было приведено к моим XElements и XAttributes со строкой, как я делал выше. Нулевое значение, приведенное к строке, будет возвращать пустую строку, предотвращая исключение нулевой ссылки, которое вы получите при вызове.Value.

Также будет работать:

xdoc.XPathSelectElement("/UserDefinedSettings/RootFolder/FolderName").Value

Я предпочитаю использовать XPath для краткости, но это ваш выбор.

Другие вопросы по тегам