如何使用c#从大型xml文件中分页读取数据

时间:2016-10-06 10:03:24

标签: c# .net xml linq pagination

我想从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文件的最佳方法是部分使用概念分页。

1 个答案:

答案 0 :(得分:0)

使用XmlReader

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication16
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            while(!reader.EOF)
            {
                if(reader.Name != "Orders")
                {
                    reader.ReadToFollowing("Orders");
                }
                if(!reader.EOF)
                {
                    XElement order = (XElement)XElement.ReadFrom(reader);
                    int OrderID = (int)order.Element("OrderID");
                    string CustomerID = (string)order.Element("CustomerID");
                    int EmployeeID = (int)order.Element("EmployeeID");
                }
            } 
        }
    }
}