代码之家  ›  专栏  ›  技术社区  ›  Alex K

linq to xml,只接受具有特定子元素的元素

  •  1
  • Alex K  · 技术社区  · 15 年前

    我想问一个老朋友的后续问题(但古蒂) Reading the list of References from csproj files (尽管我不是那个问题的作者)。

    在分析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”子句说:“where元素有子元素,其中至少一个子元素被命名为link”。错了吗?

    非常感谢您的帮助。

    1 回复  |  直到 15 年前
        1
  •  3
  •   Jon Skeet    15 年前

    我怀疑这是一个名称空间问题-您没有将名称空间用于“链接”。试试这个:

    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不是真正必要的。)