【问题标题】:How to read data with pagination from large xml file using c# [duplicate]如何使用c#从大型xml文件中读取分页数据[重复]
【发布时间】: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


【解决方案1】:

使用 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");
                }
            } 
        }
    }
}

【讨论】:

  • ReadToFollowing() 函数的作用是什么?
  • 为什么你在代码中检查 reader.EOF 两次?
  • Read Follow 将读取发布代码中的一个 Orders 元素。需要两次 EOF 检查,因为 ReadToFollowing() 可能找不到更多元素。因此,当您读取文件中的最后一个 Orders 时,它可能不是文件中的最后一个元素,因此 While 不会看到 EOF。
猜你喜欢
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
相关资源
最近更新 更多