LINQ to XML - 如何查询内部元素中的所有元素?

时间:2010-11-19 05:06:20

标签: linq linq-to-xml

<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 个答案:

答案 0 :(得分:2)

后代将使用给定名称获取所有后代节点。如果您想要具体,则需要逐个元素地向下遍历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);
}