2015-06-15 53 views
2

我有如下的XML节点。linq到XML:每个组的唯一属性值计数

... 
<ParentNode> 
    <Node id="2343" name="some name" mode="Some Mode"> 
     //Some child nodes here 
    </Node> 
    <Node id="2344" name="some other name" mode="Some Mode"> 
     //Some child nodes here 
    </Node> 
    ... 
</ParentNode> 
<ParentNode> 
    <Node id="2343" name="some name" mode="Some Other Mode"> 
     //Some child nodes here 
    </Node> 
    <Node id="2344" name="some other name" mode="Some Mode"> 
     //Some child nodes here 
    </Node> 
</ParentNode> 
.... 

我需要的是

id  name    distinct-mode-count 
-------------------------------------------- 
2343 some name  2 
2344 some other name 1 

我在下面试图让这一点。

XElement myXML = XElement.Load(filePath); 

IEnumberable<XElement> parentNodes = myXML.Descendants("ParentNode"); 

var nodeAttributes = parentNodes.Select(le => le.Descendants("Node") 
    .GroupBy(x => new { 
          id = x.Attribute("id").Value, 
          name = x.Attribute("name").Value 
         }).Select(g => new { 
          id = g.Key.id, 
          name = g.Key.name, 
          distinct_mode_count = // This is where I am stuck 
         })); 

我不确定如何在上述查询中获得distinct_mode_count。与节点内

编辑

我需要不同的属性值计数属性"mode",不管他们是在ParentNode

回答

2

假设你想要的独特的“模式”的计数属性值相同的ID /名称,您只需要将组中的每个元素投影到该模式,然后采用这些模式的不同序列,然后对其进行计数:

您只需要计算组的计数,并且也使用SelectMany“扁平”您的父节点。 (或者只是使用myXml.Descendants("Node")开始。)

短,但完整的例子给你想要的结果:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml.Linq; 

class Test 
{ 
    static void Main() 
    { 
     XElement myXML = XElement.Load("test.xml"); 

     IEnumerable<XElement> parentNodes = myXML.Descendants("ParentNode"); 
     var nodeAttributes = parentNodes 
      .SelectMany(le => le.Descendants("Node")) 
      .GroupBy(x => new { 
       Id = x.Attribute("id").Value, 
       Name = x.Attribute("name").Value 
      }) 
      .Select(g => new { 
       g.Key.Id, 
       g.Key.Name, 
       DistinctModeCount = g.Select(x => x.Attribute("mode").Value) 
            .Distinct() 
            .Count() 
      }); 
     foreach (var item in nodeAttributes) 
     { 
      Console.WriteLine(item); 
     } 
    } 
} 

或者:

XElement myXML = XElement.Load("test.xml"); 

var nodeAttributes = myXML 
    .Descendants("Node") 
    .GroupBy(...) 
    // Remaining code as before 
+0

感谢您的及时答复@乔恩飞碟双向。我需要所有父节点中的不同计数。相同的节点/父节点无关紧要。 –

+0

@DevrajGadhavi:你不明白你的意思,也不清楚你的问题。请编辑你的问题来澄清它。 –

+1

@DevrajGadhavi:我已经稍微编辑了我的答案,并将其写入了一个简短但完整的程序,它提供了您期望的结果。 –