LINQ To XML - Как запросить все элементы во внутреннем элементе? - PullRequest
2 голосов
/ 19 ноября 2010
<Results>
  <ResultSet>"nothing special" Description="More of nothing"
    <Results>
      <Result>
        <Body>Four in this group</Body>
        <Body2>this is more stuff I want</Body2>
        <Body3>This is interesting stuff I want</Body3>
        <Body4>this is more stuff I want</Body4>
      </Result>
      <Result>
        <Something1>Only 3 in the group</Something1>
        <ID>this is more stuff I want</ID>
        <Stuff>This is interesting stuff I want</Stuff>
      </Result>
      <Result>
        <Tag1>Only 3 in the group</Tag1>
        <Tag2>this is more stuff I want</Tag2>
        <Tag3>This is interesting stuff I want</Tag3>
      </Result>
    </Results>
  </ResultSet>
</Results>

Как бы я использовал Linq to XML, чтобы вытащить все блоки <Result>?Как видите, в каждом блоке может быть любое количество элементов, и я не буду знать, как они называются.Моя конечная цель - упаковать эти блоки в объекты, которые я затем передам вокруг моего приложения.

У меня проблема в том, что я не могу разделить каждую группу по отдельности с помощью Linq.Самое близкое, что я могу получить, - это вернуть все элементы ВСЕХ групп <Result> в один большой список (используя потомков).

Редактировать: это код, который я использую для возврата всего в каждой группе <Result>,Я не могу понять, как перебрать список из этого запроса, чтобы разбить пары имя / значение.Я не знаю названий элементов, поэтому я не могу ссылаться на них по имени.В конце я просто хочу пару имя / значение каждого элемента в каждом <Result>.

var query = from item in xml.Descendants("Result")
              select item;

Любая помощь?

Спасибо, -Scott

1 Ответ

2 голосов
/ 19 ноября 2010

Потомки будут захватывать все узлы-потомки с заданным именем.Если вы хотите быть конкретным, вам нужно пройтись по элементу иерархии XML, например xml.Element("ResultSet").Element("Results").Elements("Result").

Это должно указать вам правильное направление:

var query = xml.Descendants("Result")
               .Select(r => r.Elements()
                             .Select(e => new { Name = e.Name.LocalName, Value = e.Value }));
foreach (var result in query)
{
    foreach (var item in result)
    {
        Console.WriteLine("{0} : {1}", item.Name, item.Value);
    }
}

В качестве альтернативы, вы можете использовать SelectMany и сгладить набор результатов:

var query = xml.Descendants("Result")
               .SelectMany(r => r.Elements()
                                 .Select(e => new { Name = e.Name.LocalName, Value = e.Value }));
foreach (var item in query)
{
    Console.WriteLine("{0} : {1}", item.Name, item.Value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...