.net 链接到XML:每个组的唯一属性值计数

rryofs0p  于 2023-04-22  发布在  .NET
关注(0)|答案(1)|浏览(115)

我得到了如下的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);

IEnumerable<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中。

rvpgvaaj

rvpgvaaj1#

假设你想要在具有相同ID/名称的节点中计算不同的“mode”属性值,你只需要从组中的每个元素投影到模式,然后获取这些模式的不同序列,然后计算它:
您只需要计算组的个数,并使用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

相关问题