ASP.NET Xml文件读取、排序和选择优化
本文关键字:排序 选择 优化 读取 NET Xml 文件 ASP | 更新日期: 2023-09-27 18:00:10
我关心的是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,然后获得所需范围元素中的下几个。