我之前在其他文章中发布了另一篇文章,介绍如何使用XSLT转换XmlDocument,但也许可以使用LINQ来完成。帮助LINQ to Xml
我有一个看起来像一个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,并获得最高版本号的客户?
I.e.新的/已转换的文档将如下所示:
<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错误,虽然,还是我错了别人在这里做什么?
使用'XDocument.Parse',而不是'LoadXml' - 甚至只是'XElement.Parse'。如果你采用后一种路线,那么元素本身可以用作“父母”;否则你需要'doc.Root'作为'parent'。 – 2011-04-28 07:13:27
确切的错误是什么?你在使用伪指令列表中使用System.Linq吗? – 2011-04-28 09:00:22
对不起,我在第二次更新时删除了错误信息。无论如何,错误是我错误地使用system.xml.linq(所以一些linq的东西工作,有些没有),而不是system.linq。 – Peter 2011-04-28 09:18:52