Linq to XML,只接受具有某个子元素的元素

时间:2009-11-16 19:48:29

标签: c# .net linq linq-to-xml csproj

我想向老人提出一个跟进问题(但好人)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”。这是错的吗?

非常感谢帮助。

1 个答案:

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