Как правильно извлечь значение из одного вложенного 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 для краткости, но это ваш выбор.