代码之家  ›  专栏  ›  技术社区  ›  Scott

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

  •  2
  • Scott  · 技术社区  · 14 年前
    <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把每个组分开。我能得到的最接近的结果是返回 <结果> 分组到一个大列表中(使用子代)。

    编辑:这是我用来把每个 <结果> 小组。我不知道如何遍历这个查询中的list来分解名称/值对。我不知道元素的名称,所以不能按名称引用它们。最后,我只需要每个元素的名称/值对 <结果> .

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

    有什么帮助吗?

    谢谢,-斯科特

    1 回复  |  直到 14 年前
        1
  •  2
  •   Ahmad Mageed    14 年前

    子代将获取具有给定名称的所有子代节点。如果您想具体化,您需要逐项遍历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);
    }