Linq to XML, nehmen nur die Elemente, die ein bestimmtes untergeordnetes Element haben
-
20-09-2019 - |
Frage
Ich möchte eine Follow-up-Frage zu einem Oldie stellen (aber Goodie) Reading (obwohl ich nicht der Autor dieser Frage bin).
In meiner Analyse der csproj Dateien, die ich brauche, um alles auszuwählen Compile -Elemente, die haben Link Element als Kind.
Ich versuchte zunächst die Antwort auf die Frage verbunden zu verlängern, wie folgt:
IEnumerable<string> links = csprojFile
Element(msbuild + "Project")
.Elements(msbuild + "ItemGroup")
.Elements(msbuild + "Compile")
.Where(element => element.HasElements)
.Attributes("Include")
Welche offensichtlich unzureichend ist, da es alle Elemente aufnimmt, die jede Art von Kinder haben (also, während die, die Kommissionierung ich will, es Extras auch nimmt). Also habe ich versucht:
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);
... das alles nicht zurück. Ich bin ein Anfänger in Linq im Allgemeinen und Linq2XML insbesondere, aber für mich, dass „Where-Klausel“, sagt: „wo Element Kinder und mindestens eines dieser Kinder hat Link namens“. Ist das falsch?
Hilfe wird sehr geschätzt.
Lösung
Ich vermute, es ist ein Namespace Problem ist - Sie den Namespace nicht verwenden für „Link“. Versuchen Sie folgendes:
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);
(Die HasElements ist nicht wirklich notwendig.)