在LINQ上选择同一级别的多个节点

时间:2014-05-28 09:00:52

标签: c# xml linq linq-to-xml

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

我的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>

我目前正在通过XDocument.Load加载XML文档,我正在通过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();

显然上面的内容不起作用,但我想知道是否有相同的允许我做同样的事情。

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可以尝试以下方法:

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