我早些时候发布了另一篇关于如何用XSLT转换XmlDocument的文章,但也许可以用LINQ代替。
我有一个XmlDocument,看起来像:
<DocumentElement>
<Customer>
<CustomerId>2315</CustomerId>
<VersionNumber>1</VersionNumber>
<GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID>
</Customer>
<Customer>
<CustomerId>2316</CustomerId>
<VersionNumber>2</VersionNumber>
<GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID>
</Customer>
<Customer>
<CustomerId>2317</CustomerId>
<VersionNumber>1</VersionNumber>
<GUID>9995DE20-02A0-425D-944D-65E5E744FF8A</GUID>
</Customer>
</DocumentElement>
我可以使用LINQ为每个唯一GUID提取一个客户元素并获得版本号最高的客户吗?
。新的/转换后的文档看起来像:
<DocumentElement>
<Customer>
<CustomerId>2316</CustomerId>
<VersionNumber>2</VersionNumber>
<GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID>
</Customer>
<Customer>
<CustomerId>2317</CustomerId>
<VersionNumber>1</VersionNumber>
<GUID>9995DE20-02A0-425D-944D-65E5E744FF8A</GUID>
</Customer>
</DocumentElement>
提前感谢。
更新:所以我应该这样做(如果我理解正确的话?):
XDocument xdoc = new XDocument();
using (StringWriter sw = new StringWriter())
{
// Converts the datatable to XML
dt.WriteXml(sw);
xdoc = XDocument.Parse(sw.ToString());
}
var query = xdoc.Root
.Elements("Customer")
.GroupBy(x => x.Element("GUID").Value)
.Select(g => g.OrderByNumberDescending(x =>(int)x.Element("VersionNumber"))
.First());
我仍然得到GroupBy上的错误,或者我在这里做了其他错误吗?
绝对:
var query = parent
.Elements("Customer")
.GroupBy(x => x.Element("GUID").Value)
.Select(g => g.OrderByNumberDescending(x => (int) x.Element("VersionNumber"))
.First());
或者使用MoreLINQ:
var query = parent
.Elements("Customer")
.GroupBy(x => x.Element("GUID").Value)
.Select(g => g.MaxBy(x => (int) x.Element("VersionNumber")));