簡體   English   中英

C# LINQ-to-XML Select 子元素屬性最大的元素

[英]C# LINQ-to-XML Select Elements where a Child Element Attribute is Maxiumum

我有一個像這樣的 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>

我想 select <revision>元素來自每個<pr>元素,其中子元素<revision>的屬性 @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;

結果是好的,至少單元測試是這么說的,但我不確定查詢是否寫得好。

我會這樣做

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();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM