【发布时间】:2016-10-06 10:03:24
【问题描述】:
我想从XML 文件中读取数据,但我不想读取所有数据然后进行排序和过滤。基本上我不想将所有XML 数据加载到内存中,而是想通过分页读取少量数据。
我们经常用分页从数据库中读取数据,同样我想用分页从 xml 文件中读取数据。所以告诉我什么是我可以用来做的最好的课程。
我的 xml 数据如下:
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Orders>
<OrderID>10248</OrderID>
<CustomerID>VINET</CustomerID>
<EmployeeID>5</EmployeeID>
<OrderDate>1996-07-04T00:00:00</OrderDate>
<RequiredDate>1996-08-01T00:00:00</RequiredDate>
<ShippedDate>1996-07-16T00:00:00</ShippedDate>
<ShipVia>3</ShipVia>
<Freight>32.3800</Freight>
<ShipName>Vins et alcools Chevalier</ShipName>
<ShipAddress>59 rue de l'Abbaye</ShipAddress>
<ShipCity>Reims</ShipCity>
<ShipPostalCode>51100</ShipPostalCode>
<ShipCountry>France</ShipCountry>
</Orders>
</Root>
现在使用 LINQ 以这种方式阅读
XDocument document = XDocument.Load(@"c:\users\WindowsFormsApplication5\Orders.xml");
var query = from r in document.Descendants("Orders")
select new
{
OrderID = r.Element("OrderID").Value,
CustomerID = r.Element("CustomerID").Value,
EmployeeID = r.Element("EmployeeID").Value,
};
//setup query result ordering,
//assume we have variable to determine ordering mode : bool isDesc = true/false
if (isDesc) query = query.OrderByDescending(o => o.OrderID);
else query = query.OrderBy(o => o.OrderID);
//setup pagination,
//f.e displaying result for page 2 where each page displays 100 data
var page = 2;
var pageSize = 100;
query = query.Skip(page - 1*pageSize).Take(pageSize);
//execute the query to get the actual result
var items = query.ToList();
如果有人看到我上面的代码,那么一定要注意我从XML 文件中读取数据的方式。它将所有数据加载到内存中,但我想我想一次读取 10 个数据,然后只是将 10 个数据加载到内存中而不是全部。
如果XML 文件中有 10,000,000 条记录,上述编码方法将不好。那么,读取大型XML 文件的最佳方式是部分带有分页概念的最佳方式。
【问题讨论】:
-
由于您对数据进行了排序,因此您需要拥有所有数据,因此您需要阅读所有数据。
-
stackoverflow.com/questions/2441673/… -> 检查 Jon Skeet 的答案
-
你没有解释问题,但我猜这是上面代码的性能不佳。见this。对于巨大的 xml,您必须手动遍历它(没有
XDocument)。另一个问题是您要应用的排序,如果没有索引或初始排序,它将无法正常工作。
标签: c# .net xml linq pagination