我想向老人提出一个跟进问题(但好人)Reading the list of References from csproj files(虽然我不是那个问题的作者)。
在解析csproj文件时,我需要选择所有 Compile 元素,这些元素将 Link 元素作为子元素。
我首先尝试将链接问题的答案扩展如下:
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”子句说:“where元素中有子元素,其中至少有一个子元素被命名为Link”。这是错的吗?
非常感谢帮助。
答案 0 :(得分:3)
我怀疑这是一个命名空间问题 - 你没有使用“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不是必需的。)