Linq to XML 选择与模式匹配的子元素名称列表

本文关键字:元素 列表 模式匹配 to XML 选择 Linq | 更新日期: 2023-09-27 17:55:19

有关嵌套 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>

问题:

我正在尝试做的是构建一个包含"bb"、"cc"和"dd"的列表,当我使用"a"参数调用上述函数时。 虽然上面的代码有效,但我认为如果我更流利地使用 LINQ,我将能够直接在 LINQ 代码中生成我的列表,而不必依赖 foreach 循环来迭代 IEnumerable。 我看过这个网站上的一些例子,还有其他人试图找到这个确切的案例,但没有太多的运气。 我见过一些使用 lambda 表达式或对"select"语句执行其他操作的示例,但我没有任何运气获得从中编译的代码。 也许添加一个 3rd from 语句,类似于

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

但这给出了一个错误:

在源类型为"System.Collections.Generic.IEnumerable"的查询表达式的后续 from 子句中不允许使用类型为"System.Xml.Linq.XAttribute"的表达式。 类型推断在调用"选择多个"时失败。

Linq to XML 选择与模式匹配的子元素名称列表

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

你可能想要

let subSubResponse = subResponse.Attribute("Name")

或者只是

select subResponse.Attribute("Name").Value