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>
我想从每个 <pr>
元素中 select <revision>
元素,其中子元素 <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();
}
}
}
我有一个这样的 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>
我想从每个 <pr>
元素中 select <revision>
元素,其中子元素 <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();
}
}
}