Linq to XML,仅获取具有特定子元素的元素
-
20-09-2019 - |
题
我想问一个老歌(但是好歌)的后续问题 从 csproj 文件中读取引用列表 (尽管我不是这个问题的作者)。
在解析 csproj 文件时,我需要选择所有 编译 具有的元素 关联 元素作为一个孩子。
我首先尝试将链接问题的答案扩展如下:
IEnumerable<string> links = csprojFile
Element(msbuild + "Project")
.Elements(msbuild + "ItemGroup")
.Elements(msbuild + "Compile")
.Where(element => element.HasElements)
.Attributes("Include")
这显然是不够的,因为它会选择具有任何类型子元素的所有元素(因此,在选择我想要的元素时,它还会选择额外的元素)。然后我尝试了:
IEnumerable<string> links = csprojFile
.Element(msbuild + "Project")
.Elements(msbuild + "ItemGroup")
.Elements(msbuild + "Compile")
.Where(element => element.HasElements && element.Descendants("Link").Any())
.Attributes("Include")
.Select(element => element.Value);
...它不返回任何内容。一般来说,我是 Linq 的初学者,特别是 Linq2XML 的初学者,但对我来说,“Where”子句说:“其中元素有子元素,并且这些子元素中至少有一个名为 Link”。这是错误的吗?
非常感谢您的帮助。
解决方案
我怀疑这是一个命名空间问题 - 您没有使用“链接”的命名空间。尝试这个:
IEnumerable<string> links = csprojFile
.Element(msbuild + "Project")
.Elements(msbuild + "ItemGroup")
.Elements(msbuild + "Compile")
.Where(element => element.Descendants(msbuild + "Link").Any())
.Attributes("Include")
.Select(attr => attr.Value);
(HasElements 并不是真正必要的。)
不隶属于 StackOverflow