У меня есть XDocument
объект. Я хочу запросить элементы с определенным именем на любой глубине, используя LINQ. Когда я использую Descendants("element_name")
, я получаю только элементы, которые являются прямыми потомками текущего уровня. То, что я ищу, является эквивалентом "// element_name" в XPath ... я должен просто использовать XPath
, или есть ли способ сделать это с помощью методов LINQ? Спасибо.
143
doc.Descendants("Cars").Descendants("Part")
(или, возможно,.Elements("Part")
если бы они были только прямыми детьми.var foo = new XDocument().Descendants("Bar").Descendants("Baz");
потому чтоDescendants
возвращает пустое,IEnumerable<XElement>
а неnull
.Пример, указывающий пространство имен:
источник
Вы можете сделать это следующим образом:
где
xml
этоXDocument
.Имейте в виду, что свойство
Name
возвращает объект, который имеетLocalName
иNamespace
. Вот почему вы должны использовать,Name.LocalName
если вы хотите сравнить по имени.источник
Потомки будут делать именно то, что вам нужно, но убедитесь, что вы включили имя пространства имен вместе с именем элемента. Если вы пропустите это, вы, вероятно, получите пустой список.
источник
Есть два способа сделать это,
Ниже приведены примеры использования этих подходов,
Если вы используете XPath, вам нужно сделать некоторые манипуляции с IEnumerable:
Обратите внимание, что
результаты либо нулевой указатель, либо нет результатов.
источник
XPathEvaluate
находится вSystem.Xml.XPath
пространстве имен.Я использую
XPathSelectElements
метод расширения, который работает так же, какXmlDocument.SelectNodes
метод:источник
После ответа @Francisco Goldenstein я написал метод расширения
источник
мы знаем, что вышеизложенное верно. Джон никогда не ошибается; реальные желания могут пойти немного дальше
Например, обычно проблема в том, как мы можем получить EchoToken в приведенном выше XML-документе? Или как размыть элемент с именем attrbute.
1- Вы можете найти их, используя пространство имен и имя, как показано ниже
2- Вы можете найти его по значению атрибута содержимого, как этот
источник
Это мой вариант решения на основе
Linq
и потомков методаXDocument
классаПолученные результаты:
Для более подробной информации о
Desendants
методе посмотрите здесь.источник
(Код и инструкции предназначены для C # и, возможно, должны быть слегка изменены для других языков)
Этот пример отлично работает, если вы хотите читать с родительского узла, у которого много дочерних элементов, например, посмотрите на следующий XML;
Теперь с этим кодом ниже (помните, что XML-файл хранится в ресурсах (см. Ссылки в конце фрагмента для получения справки о ресурсах). Каждый адрес электронной почты можно получить в теге «emails».
Полученные результаты
Примечание. Для консольного приложения и WPF или Windows Forms необходимо добавить «using System.Xml.Linq;» Используя директиву в верхней части вашего проекта, для консоли вам также нужно будет добавить ссылку на это пространство имен перед добавлением директивы Using. Также для консоли не будет файла ресурсов по умолчанию в «Папке свойств», поэтому вы должны вручную добавить файл ресурсов. Статьи MSDN ниже, объясняют это подробно.
Добавление и редактирование ресурсов
Как: добавить или удалить ресурсы
источник