C# LINQ-to-XML 选择子元素属性最大的元素

Posted

技术标签:

【中文标题】C# LINQ-to-XML 选择子元素属性最大的元素【英文标题】:C# LINQ-to-XML Select Elements where a Child Element Attribute is Maxiumum 【发布时间】:2021-06-10 10:56:58 【问题描述】:

我有一个这样的 XML 示例:

  <prs>
    <pr number="1">
      <revisions>
        <revision revNum="0"></revision>
        <revision revNum="1"></revision>
        <revision revNum="2"></revision>
      </revisions>
    </pr>
    <pr number="2">
      <revisions>
        <revision revNum="0"></revision>
        <revision revNum="1"></revision>
      </revisions>
    </pr>
    <pr number="3">
      <revisions>
        <revision revNum="0"></revision>
      </revisions>
    </pr>
  </prs>

我想从每个&lt;pr&gt; 元素中选择&lt;revision&gt; 元素,其中子元素&lt;revision&gt; 的@revNum 属性最大。

所以返回的列表是这样的:

<revision revNum="2"></revision>  >> Child of pr with @number=1
<revision revNum="1"></revision>  >> Child of pr with @number=2
<revision revNum="0"></revision>  >> Child of pr with @number=3

所以我尝试了这段代码:

        XDocument testDoc = XDocument.Load("sample.xml");

        IEnumerable<XElement> revQuery =
            from rev in (testDoc.Descendants("pr").Select(pr => pr)).Descendants("revision")
            where int.Parse(rev.Attribute("revNum").Value) ==
            rev.Parent.Elements("revision").Max(revNum => int.Parse(revNum .Attribute("revNum").Value))
            select rev;

结果是好的,至少单元测试是这么说的,但我不确定查询是否写得好。

【问题讨论】:

使用MinBy 会更好——这不是 linq 的一部分(很烦人),但你自己写很容易——在 SO 上有很多很好的实现 【参考方案1】:

我会这样做

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

namespace ConsoleApplication1

    class Program
    
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        
            XDocument doc = XDocument.Load(FILENAME);

            var results = doc.Descendants("pr").Select(x => new
            
                number = (int)x.Attribute("number"),
                maxRevNum = x.Descendants("revision").Max(y => (int)y.Attribute("revNum"))
            ).ToList();
        
    

【讨论】:

以上是关于C# LINQ-to-XML 选择子元素属性最大的元素的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用 LINQ-To-XML 解析具有多个列表和类对象的 XML 数据

如何使用 selenium webdriver、NUnit 和 C# 获取元素属性的子属性值

c# 如何获取列表中某个属性最大或最小的元素?

C#:XPath 选择具有包含子字符串的属性的节点?

CSS中的权重

CSSCSS 复合选择器 ② ( 子元素选择器 | 交集选择器 )