【发布时间】:2020-09-07 12:00:27
【问题描述】:
我正在使用 XQuery/BaseX 查看大型 XML 文件以查找某些计数器的历史数据。所有文件都被压缩并存储在驱动器的某个位置。文件的重要部分如下所示:
<measInfo xmlns="http://www.hehe.org/foo/" measInfoId="uplink speed">
<granPeriod duration="DS222S" endTime="2020-09-03T08:15:00+02:00"/>
<repPeriod duration="DS222S"/>
<measTypes>AFD123 AFD124 AFD125 AFD156</measTypes>
<measValue measObjLdn="PLDS-PLDS/STBHG-532632">
<measResults>23 42 12 43</measResults>
</measValue>
</measInfo>
我构建了以下查询:
declare default element namespace "http://www.hehe.org/foo/";
let $sought := ["AFD124", "AFD125"]
let $datasource := collection("C:\Users\Patryk\Desktop\folderwitharchives")
let $filename := concat(convert:dateTime-to-integer(current-dateTime()), ".xml")
for $meas in $datasource/measCollecFile/measData/measInfo return
for $measType at $i in $meas/tokenize(measTypes)[. = $sought] return
file:append($filename,
<meas
measInfoId="{data($meas/@measInfoId)}"
measObjLdn="{data($meas/measValue/@measObjLdn)}"
>
{$meas/granPeriod}
{$meas/repPeriod}
<measType>{$measType}</measType>
<measValue>{$meas/measValue/tokenize(measResults, " ")[$i]}</measValue>
</meas>)
脚本有效,但某些计数器 (measType) 需要很长时间。我阅读了有关索引的文档,我的想法是以某种方式索引所有 measTypes(字符串的一部分),这样一旦我需要查看整个存档以查找计数器,就可以快速访问它。我不确定直接对档案进行操作时是否可以?我必须为它们创建一个新数据库吗?由于文件的大小,我不希望这样做。如何为这种情况创建索引?
【问题讨论】:
-
我认为您不能索引
tokenize调用的结果。简单地使用序列let $sought := (AFD124", "AFD125")而不是let $sought := ["AFD124", "AFD125"]中的数组可能会产生一个小的改进,因为这样. = $sought不必在每次比较完成时展平数组。不过,我还没有测试过它是否表现更好。
标签: xpath indexing xquery basex