Выбор нескольких узлов на одном уровне с LINQ

1

Я пытаюсь выбрать несколько узлов в одном запросе.

Мой XML выглядит

<View Id="View#1">
    <Node1 DefinitionId="DefinitionId1">
        // ...
    </Node1>
</View>
<View Id="View#2">
    <Node2 DefinitionId="DefinitionId2">
        // ...
    </Node2>
</View>
<View Id="View#3">
    <Node3 DefinitionId="DefinitionId3">
        // ...
    </Node3>
</View>

В настоящее время у меня есть документ XML, загруженный через XDocument.Load, и я анализирую полученный XML через LINQ to XML.

Я в основном пытаюсь получить весь идентификатор определения всех типов узлов в одну коллекцию строк.

Мой текущий код выглядит так

IList<string> node1Ids = _xmlFile
    .Descendants("Node1")
    .Select(n => n.Attribute("DefinitionId").Value).ToList();

IList<string> node2Ids = _xmlFile
    .Descendants("Node2")
    .Select(n => n.Attribute("DefinitionId").Value).ToList();

Есть ли способ поместить все это в один запрос, такой как

IList<string> nodeIds = _xmlFile
    .Descendants("Node1")
    .Descendants("Node2")
    .Descendants("Node3")
    .Select(n => n.Attribute("DefinitionId").Value).ToList();

Очевидно, что это не работает, но мне интересно, есть ли эквивалент, позволяющий мне делать то же самое.

Теги:
linq
linq-to-xml

2 ответа

2
Лучший ответ

Вы можете попробовать _xmlFile.Descendants("View").Elements().Attributes("DefinitionId").Select(a => a.Value).ToList(). Это предполагает, что вы ищете атрибуты DefinitionId всех дочерних элементов всех элементов View. Или вам нужно что-то вроде Descendants().Where(d => d.Name.LocalName.StartsWith("Node")).Attributes("DefinitionId").Select(a => a.Value).ToList().

1

Вы можете попробовать:

IList<string> nodeIds = _xmlFile
    .Descendants().Where( d => d.Name.LocalName.StartsWith("Node") )
    .Select(n => n.Attribute("DefinitionId").Value).ToList();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню