1

我想问一个从 csproj 文件中读取引用列表的老歌(但好人)的后续问题(尽管我不是该问题的作者)。

在解析 csproj 文件时,我需要选择所有具有Link元素作为子元素的Compile元素。

我首先尝试将答案扩展到链接问题,如下所示:

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”。那是错的吗?

非常感谢您的帮助。

4

1 回答 1

3

我怀疑这是一个命名空间问题——你没有使用“链接”的命名空间。试试这个:

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 并不是必需的。)

于 2009-11-16T19:53:41.203 回答