Что такое эквивалент LINQ to XML для этого XPath - PullRequest
4 голосов
/ 16 января 2009

Мне интересно, какой способ «наилучшей практики» (в C #) заключается в реализации этого запроса xpath с помощью LINQ:

/topNode/middleNode[@filteringAttribute='filterValue']/penultimateNode[@anotherFilterAttribute='somethingElse']/nodesIWantReturned

Мне бы хотелось, чтобы в IEnumerable был список 'nodeIWantReturned', но только из определенного раздела дерева XML, в зависимости от значения атрибутов предка.

Ответы [ 3 ]

10 голосов
/ 16 января 2009

В дополнение к показанным методам Linq вы также можете импортировать пространство имен System.Xml.XPath, а затем использовать метод расширения XPathSelectElements для непосредственного использования запроса XPath.

В классе отмечается, что эти методы медленнее, чем «правильный» Linq-to-XML, однако в большинстве случаев это не так уж важно, а иногда проще просто использовать XPath (это, безусловно, много terser!).

var result = doc.XPathSelectElements("your xpath here");
3 голосов
/ 16 января 2009
var result = root.Elements("topNode")
                 .Elements("middleNode")
                 .Where(a => (string)a.Attribute("filteringAttribute") == "filterValue")
                 .Elements("penultimateNode")
                 .Where(a => (string)a.Attribute("anotherFilterAttribute") == "somethingElse")
                 .Elements("nodesIWantReturned");
0 голосов
/ 16 января 2009

Еще словесное решение:

var nodesIWantReturned = from m in doc.Elements("topNode").Elements("middleNode")
              from p in m.Elements("penultimateNode")
              from n in p.Elements("nodesIWantReturned")
              where m.Attribute("filteringAttribute").Value == "filterValue"
              where p.Attribute("anotherFilterAttribute").Value == "somethingElse"
              select n;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...