我想问一个老歌(但是好歌)的后续问题 从 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 并不是真正必要的。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top