Как мне выполнить этот XPath-запрос с Linq? - PullRequest
1 голос
/ 15 июня 2010

В следующем коде я использую XPath для поиска всех подходящих узлов с помощью XPath и добавляю значения в StringBuilder.

StringBuilder sb = new StringBuilder();
foreach (XmlNode node in this.Data.SelectNodes("ID/item[@id=200]/DAT[1]/line[position()>1]/data[1]/text()"))
{
    sb.Append(node.Value);
}
return sb.ToString();

Как мне сделать то же самое, кроме использования Linq to XML? Предположим, что в новой версии this.Data является объектом XElement.

Ответы [ 4 ]

1 голос
/ 15 июня 2010

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

var xml = XDocument.Parse("<xml></xml>");
var elements = xml.XPathSelectElements("ID/item[@id=200]/DAT[1]/line[position()>1]/data[1]/text()");
0 голосов
/ 17 февраля 2014

Я создал вспомогательную библиотеку с открытым исходным кодом, которая позволяет генерировать выражения xpath с использованием выражений Linq-esq.Не уверен, что это полезно в вашем контексте, но публикуя ссылку на API

http://www.syntaxsuccess.com/viewarticle/how-to-create-xpath-using-linq

0 голосов
/ 16 июня 2010

Вы можете попробовать что-то вроде этого:

var query = 
    from id in this.Data.Elements("ID")                      // ID
    from item in id.Elements("item")                         // /item
    where item.Attribute("id").Value == "200"                // [@id=200]
    let dat in item.Elements("DAT").ElementAtOrDefault(1)    // /DAT[1]
    where dat != null                                        // (ensure there is an element at index 1)
    from line in dat.Elements("line").Skip(1)                // /line[position()>1]
    let data in line.Elements("data").ElementAtOrDefault(1)  // /data[1]
    where data != null                                       // (ensure there is an element at index 1)
    select data                                              // /text()

StringBuilder sb = new StringBuilder();
foreach(XElement data in query)
{
    sb.Append(data.Value);
}
return sb.ToString();

Как видите, это не совсем удобно, чем XPath, поэтому вам, вероятно, следует продолжать использовать XPath (как объяснено в ответе Пьера-Алена)

0 голосов
/ 15 июня 2010

Синтаксис запроса будет выглядеть примерно так:

var nodes = from item in Data.Elements("item")
            where item.Attribute("id").Value == "200"
            let dat = item.Element("DAT")
            from line in dat.Elements("line").Skip(1)
            let data = line.Element("data")
            select data;

var sb = new StringBuilder();
foreach (var node in nodes)
    sb.Append(node.Value);

... это избавит от возможных исключений nullref и избавит от цикла foreach.

var nodes = from item in Data.Elements("item")
            let id = item.Attribute("id")
            where id != null && id.Value == "200"
            let dat = item.Element("DAT")
            where dat != null
            from line in dat.Elements("line").Skip(1)
            let data = line.Element("data")
            where data != null
            select data.Value;
return nodes.Aggregate(new StringBuilder(), (sb, r) => sb.Append(r))
            .ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...