ASP.NET Xml文件读取、排序和选择优化



我关心的是web应用程序的实现,该应用程序需要显示xml文件中的一些数据。

场景

xml文件以如下方式存储数据:

<?xml?>
<Root>
   <Block>
      <Data1>...<Data1>
      <Data2>...<Data2>
      <Data3>...<Data3>
      <Data4>...<Data4>
   </Block>
   <Block>
      <Data1>...<Data1>
      <Data2>...<Data2>
      <Data3>...<Data3>
      <Data4>...<Data4>
   </Block>
   ...
   <Block>
      <Data1>...<Data1>
      <Data2>...<Data2>
      <Data3>...<Data3>
      <Data4>...<Data4>
   </Block>
</Root>

好吧,考虑一下这个文件会显著增长。

问题

当我加载ASP.NET web表单时,我必须做的第一件事就是对该文件进行分页。好吧,我需要对文件进行排序,然后对其进行分页,你们都知道,如果不读取所有文件(读取所有块),就不可能正确地对已排序的文件进行分页。

当前解决方案

为了对排序后的数据进行排序和分页(我加载xml,其中的数据在DataTable中发布),我从文件中获取所有数据并填充DataTable,我将其应用于指定排序选项的DataView,我对表进行排序,然后使用MyDataView.ToTable()来获得排序后的DataTable

这不是一个很好的方法(考虑到我每次加载页面时都这样做)。

需要更好的解决方案

我想优化这一点,因为我需要页面,我没有理由加载整个文件,然后只显示其中的一部分

为了稍微优化一下,当我加载另一个页面时,我应该重新加载所有文件,然后只选择DataTable中的另一个行范围。与其这样做,不如将DataTable存储在ViewState中,这样,至少我不需要重新分析整个xml文件。

但它仍然不好。

理想的解决方案

我想做的是:

1) 以"轻模式"解析xml文件:我指的是扫描所有文件,但不需要太深入地检查它的模式。。。仅使用第一个子(Data1)。

2) 对整个数据的部分视图进行排序。

3) 获取id(每个区块都有一个id)

4) 重新检查文件,深入,只关注那些具有指定ID 的块

我的问题

我的问题是:

1) 我能以某种方式实现这个理想的解决方案吗?

2) 这是一个好的解决方案吗?

3) 有没有更好的方法来解决这个问题(我认为这是一个非常常见的问题)?

请记住,我的目标是优化访问大型xml文件进行排序和分页的时间!

谢谢

备注

1) Xml是必需的,我不能使用SqlServer或MySql或类似的。

您可以执行以下操作:

int min = 10;
int max = 20;
XElement root = XElement.Load(file);
IEnumerable<XElement> range = root.Elements("Block")
   .Where(xe =>
   {
      var value = xe.Attribute("Id");
      if(null == value) return false;
      int id = (int)value;
      return id >= min && id <= max;
   });

然后存储最后的min&ViewState中的最大值。

如果对块Id进行了排序,您只需要找到第一个Id,然后获得所需范围元素中的下几个。

最新更新