c# - 如何使用 LINQ 从 XML 文件中获取完整列表?

标签 c# xml linq

我的 xml 文件看起来像这样:

<Knowledge>
  <Group name="Methods and Techniques">
    <Item name="OO" level="1" />
    <Item name="Dataflow Diagram" level="4" />
    <Item naeme="SDM" level="5" />
  </Group>
  <Group name="Languages">
    <Item name="C#" level="1" />
    <Item name="Delphi" level="1" />
    <Item name="Visual Basic" level="4" />  
  </Group>
</Knowledge>

...我想使用 LINQ 查询创建一个列表。

 var queryKnowledge = (from item in _Document.Descendants("Knowledge").Elements("Group")
                             select new
                             {
                                 Group = (string)item.Attribute("name"),
                                 Name = (string)item.Element("Item").Attribute("name"),
                                 Level = (string)item.Element("Item").Attribute("level")
                             }).AsQueryable();  

但我得到了两个项目的列表。每组第一名。

但是我如何得到一个看起来像这样的列表?

Group                  Name              Level
Methods and Techniques OO                1
Methods and Techniques Dataflow Diagram  4
Methods and Techniques SDM               5
Languages              C#                1
Languages              Delphi            1
Languages              Visual Basic      4

我必须在 LINQ 查询中更改什么?

最佳答案

您需要使用 SelectMany LINQ 方法或使用 LINQ to XML 提供的 Elements 方法来扁平化您的层次结构,它们执行相同的工作。

//xml variable contains string representation of your xml
//use XDocument.Load(filePath) to load xml having path to a file
var nodes = XDocument.Parse(xml)
                     .Descendants("Knowledge")
                     .Elements("Group")
                     .Elements("Item");

var queryKnowledge = from item in nodes
                             select new
                             {
                                 Group = (string)item.Parent.Attribute("name"),
                                 Name = (string)item.Attribute("name"),
                                 Level = (string)item.Attribute("level")
                             };

打印

Group                  Name             Level 
Methods and Techniques OO               1 
Methods and Techniques Dataflow Diagram 4 
Methods and Techniques null             5 
Languages              C#               1 
Languages              Delphi           1 
Languages              Visual Basic     4 

null 是因为您在一个项目中的属性名称为 naeme。据我所知,您在这里也不需要 AsQueryable

Chris 友善地指出,您可以使用下一个代码片段来收集所需的节点,然后应用相同的 Select 投影。

var nodes = XDocument.Parse(xml).Descendants("Item");

关于c# - 如何使用 LINQ 从 XML 文件中获取完整列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15521652/

相关文章:

xml - 如何使用Hadoop处理大型XML文件?

xml - 使用由文本和数值组成的数据对 xslt 进行排序

c# - 在没有适当的 REST-Api 的情况下测试 RestSharp 的反序列化

c# - Linq to object 的性能问题需要更多时间

c# - 连接两个列表时如何处理重复的键?

c# - Xamarin 使用自定义 UINavigationBar 子类化 UINavigationController

c# - MEF - 将默认创建策略更改为 NonShared

c# - 使用泛型将类型信息传递给父类(super class)

c# - 我如何在 Unity3D 中进行触摸操作?

c# - 如何使用 linq 内连接后获取两个数据表的列