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"的表达式。 类型推断在调用"选择多个"时失败。
只能在返回集合的表达式上使用from
。
.Attribute("Name")
不会返回集合,因此该行没有意义。
你可能想要
let subSubResponse = subResponse.Attribute("Name")
或者只是
select subResponse.Attribute("Name").Value