0

关于嵌套 LINQ to XML 查询的问题:

代码:

List<string> GetNames(string fooName)
{
  string fileName = "foo.xml";

  XElement myFile = XElement.Load(fileName);
  IEnumerable<XElement> bars =
     from response in myFile.Elements("foo")
     where response.Attribute("fooName").Value.Equals(fooName)
     from subResponse in response.Descendants()
     select subResponse;

  List<string> sNames = new List<string>();

  foreach (XElement el in bars)
  {
     XAttribute NameAttr = el.Attribute("Name");
     sNames.Add(NameAttr.Value);
  }
  return sNames;
}

xml:

<topElem>
  <foo fooname="a">
     <bar Name= "bb"/>
     <bar Name= "cc"/>
     <bar Name= "dd"/>
  </foo>
</topElem>

问题:

当我使用参数“a”调用上述函数时,我要做的是构建一个包含“bb”、“cc”和“dd”的列表。虽然上面的代码有效,但我认为如果我更流利地使用 LINQ,我将能够直接在 LINQ 代码中生成我的列表,而不必依赖 foreach 循环来迭代 IEnumerable。我查看了该站点上的许多示例,以及其他试图找到这种确切情况的示例,但运气不佳。我已经看到了一些使用 lambda 表达式或对“select”语句执行其他操作的示例,但我没有任何运气获得从中编译出来的代码。也许添加第三个 from 声明,比如

from subSubResponse in subResponse.Attribute("Name")
select subResponse.Value

但这给出了一个错误:

源类型为“System.Collections.Generic.IEnumerable”的查询表达式的后续 from 子句中不允许使用“System.Xml.Linq.XAttribute”类型的表达式。对“SelectMany”的调用中的类型推断失败。

4

1 回答 1

0

您只能from在返回集合的表达式上使用。
.Attribute("Name")不返回集合,因此该行没有意义。

你可能想要

let subSubResponse = subResponse.Attribute("Name")

要不就

select subResponse.Attribute("Name").Value
于 2013-01-22T16:57:45.743 回答