选择多个节点在同一级别w/ LINQ

本文关键字:一级 LINQ 节点 选择 | 更新日期: 2023-09-27 18:05:25

我正在尝试在一个查询中选择多个节点。

我的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加载。加载后,我正在通过LINQ to XML解析生成的XML。

我基本上试图获得所有节点类型的所有定义id到一个字符串集合。

我当前的代码是这样的

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();

显然上面没有工作,但我想知道是否有一个等效的允许我做同样的事情。

选择多个节点在同一级别w/ LINQ

您可以试试_xmlFile.Descendants("View").Elements().Attributes("DefinitionId").Select(a => a.Value).ToList()。假设您正在查找所有View元素的所有子元素的DefinitionId属性。或者需要Descendants().Where(d => d.Name.LocalName.StartsWith("Node")).Attributes("DefinitionId").Select(a => a.Value).ToList()

您可以尝试如下:

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