C# 如何使用LINQ从XML文件中获取完整列表?
我的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
<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();