2

私は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();  

しかし、私は2つのアイテムのリストを取得します。各グループの最初。

しかし、リストを取得する方法はこれに見えますか?

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クエリで何を変更する必要がありますか?

4

2 に答える 2

7

同じジョブを実行するSelectManyLinqメソッドまたはLINQtoXMLによって提供されるメソッドを使用して、階層をフラット化する必要があります。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 

null1つのアイテムの属性の名前が。であるためnaemeです。AsQueryable私が見る限り、ここも必要ありません。

クリスが親切に指摘したように、次のコードスニペットを使用して必要なノードを収集し、同じSelectプロジェクションを適用できます。

var nodes = XDocument.Parse(xml).Descendants("Item");
于 2013-03-20T11:04:43.813 に答える
3

実際、例は非常に単純なので、 ParentをItem呼び出してノードElements("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();

例では、そのような要素が1つしかないことを前提として、Descendants()ではなくElement()への最初の呼び出しを変更したことに注意してください。

于 2013-03-20T11:11:42.797 に答える