我有一个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-query创建一个列表。
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-query中更改什么?
发布于 2013-03-20 19:04:44
您需要使用SelectMany Linq方法或使用LINQ提供的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");发布于 2013-03-20 19:11:43
实际上,由于您的示例非常简单,您可以通过调用Elements("Item")来获取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(),而不是Descendants(),假设您的示例中只有一个这样的元素。
https://stackoverflow.com/questions/15521652
复制相似问题