【问题标题】:Linq to XML, only take elements that have a certain child elementLinq to XML,只取具有某个子元素的元素
【发布时间】:2010-12-17 04:43:36
【问题描述】:

我想问一个老歌(但很好)Reading the list of References from csproj files 的后续问题(尽管我不是该问题的作者)。

在解析 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”。有错吗?

非常感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 像魅力一样工作,谢谢。我知道它应该在那里,并且在我的脑海中它是(显然覆盖了我的眼睛所看到的),有时需要另一个人指向(并笑)显而易见的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多