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

C# 如何使用LINQ从XML文件中获取完整列表?,c#,xml,linq,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="Langu

我的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>
但我有两个项目的清单。每组第一名

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

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
projection

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

实际上,由于您的示例非常简单,您可以通过调用
元素(“项目”)
来获取
项目
节点,并使用Parent获取组名:

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

注意:我更改了对Element()的第一次调用,而不是对substands()的第一次调用,假设您的示例中只有一个这样的元素。

您也可以选择_Document.substands(“项”),假设这是整个架构。谢谢。它起作用了。我不得不稍微修改一下“var\u Document=XDocument.Load(Server.MapPath(“/App\u Data/Kennis.xml”);”。。。然后:“var nodes=\u Document”,其余的都一样。@user1531040好的,只是
\u Document
对局部变量来说似乎不是个好名字,所以我用了我的名字。不管怎样,很高兴能帮你解决这个问题。而且看起来很简单。
    var queryKnowledge = (from item in xDoc.Element("Knowledge").Elements("Group").Elements("Item")
                          select new
                          {
                              Group = (string)item.Parent.Attribute("name"),
                              Name = (string)item.Attribute("name"),
                              Level = (string)item.Attribute("level")
                          }).AsQueryable();