【问题标题】:linq to XML: unique attribute value count per grouplinq to XML:每组的唯一属性值计数
【发布时间】:2015-06-15 09:36:14
【问题描述】:

我有如下的 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 中。

【问题讨论】:

    标签: c# .net linq xelement


    【解决方案1】:

    假设您想要在具有相同 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
    

    【讨论】:

    • 感谢@Jon Skeet 的及时回复。我需要所有父节点中的不同计数。相同节点/父节点无所谓。
    • @DevrajGadhavi:不清楚你的意思是什么,你的问题也不清楚。请编辑您的问题以澄清它。
    • @DevrajGadhavi:我已经稍微编辑了我的答案,并将其放入一个简短但完整的程序中,它可以提供您想要的结果。
    • 这行得通,谢谢乔恩!我需要对parentNodes 进行更多处理。这就是为什么我没有直接将Node 视为Descendents
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多