Конвертация XPath в LINQ - PullRequest
       11

Конвертация XPath в LINQ

4 голосов
/ 06 февраля 2011

Работая с файлом XML в C #, я пытаюсь преобразовать запрос XPath в LINQ, и я не знаю, как выполнить последний раздел:

XPath:

variable.XPathSelectElements("procedures/menu[@id='value']/procedure[@id]")

LINQ:

from el in variable.Descendants("procedures").Descendants("menu")
where el.Element("id").Value == "value"

Как мне выполнить раздел /ystem [@id]?

Я изменил ваше предложение @Jon, но, похоже, я делаю простую ошибкувот что я не могу решить.

XDocument doc = XDocument.Load("procedures.xml");
var query = doc.Elements("procedures")
               .Elements("menu")
               .Where(x => (string) x.Attribute("id") == "value")
               .Elements("procedure").Where(x => x.Attribute("id") != null);

public List<string> commands = new List<string>();
foreach (XElement procedure in query) {
    commands.Add(procedure.Attribute("id"));
}

1 Ответ

8 голосов
/ 06 февраля 2011

/procedure[@id] выбирает все элементы «method», которые имеют атрибут «id». Тем не менее, я не думаю, что вы должны использовать Descendants в этом случае. Я считаю, что ваш запрос действительно должен быть:

 variable.Elements("procedures")
         .Elements("menu")
         .Where(x => (string) x.Attribute("id") == "value")
         .Elements("procedure")
         .Where(x => x.Attribute("id") != null);

РЕДАКТИРОВАТЬ: Существует более простой способ получить идентификаторы команд в списке:

XDocument doc = XDocument.Load("procedures.xml");
var commands = doc.Elements("procedures")
                  .Elements("menu")
                  .Where(x => (string) x.Attribute("id") == "value")
                  .Elements("procedure")
                  .Where(x => x.Attribute("id") != null)
                  .Select(x => x.Attribute("id").Value)
                  .ToList();
...