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