首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用LINQ从XML文件中获取完整的列表?

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

Stack Overflow用户
提问于 2013-03-20 19:00:45
回答 2查看 712关注 0票数 2

我有一个xml文件,看起来像这样:

代码语言:javascript
复制
<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创建一个列表。

代码语言:javascript
复制
 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();  

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

但是我是如何得到一个列表的呢?

代码语言:javascript
复制
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中更改什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-20 19:04:44

您需要使用SelectMany Linq方法或使用LINQ提供的Elements方法来扁平化您的层次结构,这两种方法都可以完成相同的工作。

代码语言:javascript
复制
//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")
                             };

打印

代码语言:javascript
复制
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投影。

代码语言:javascript
复制
var nodes = XDocument.Parse(xml).Descendants("Item");
票数 7
EN

Stack Overflow用户

发布于 2013-03-20 19:11:43

实际上,由于您的示例非常简单,您可以通过调用Elements("Item")来获取Item节点,并使用Parent来获取组名称:

代码语言:javascript
复制
    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(),假设您的示例中只有一个这样的元素。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15521652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档