Linq to XML, принимать только элементы, которые имеют определенный дочерний элемент - PullRequest
1 голос
/ 16 ноября 2009

Я хотел бы задать дополнительный вопрос старому (но вкусному) Чтение списка ссылок из файлов csproj (хотя я не являюсь автором этого вопроса).

В моем анализе файлов csproj мне нужно выбрать все Компилировать элементы, которые имеют 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 в частности, но для меня это предложение «Где» гласит: «где элемент имеет детей, и по крайней мере один из этих детей называется Link». Это неправильно?

Помощь очень ценится.

1 Ответ

3 голосов
/ 16 ноября 2009

Я подозреваю, что это проблема пространства имен - вы не используете пространство имен для "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 на самом деле не нужен.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...