簡體   English   中英

如何使用LINQ從XML文件中獲取完整列表?

[英]How do I get a complete list from a XML-file by using 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是因為一個Item中的屬性名稱為naeme 據我AsQueryable ,你在這里也不需要AsQueryable

正如克里斯親切地指出的那樣,您可以使用下一個代碼片段來收集所需的節點,然后應用相同的Select投影。

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

實際上,因為您的示例非常簡單,您可以通過調用Elements("Item")獲取Item節點,並使用Parent獲取Group名稱:

    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(),假設你的例子只有一個這樣的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM