Xml XQuery:仅在需要时进行迭代的最有效方法?

Xml XQuery:仅在需要时进行迭代的最有效方法?,xml,for-loop,xquery,exist-db,Xml,For Loop,Xquery,Exist Db,下面是我的示例:例如,如果我有一个包含500.000个条目的非常大的XML文件,如下所示: <entries> <entry id="1">...</entry> <entry id="2">...</entry> <entry id="3">...</entry> ... <entry id="500000">...</entry> </entries>

下面是我的示例:例如,如果我有一个包含500.000个条目的非常大的XML文件,如下所示:

<entries>
  <entry id="1">...</entry>
  <entry id="2">...</entry>
  <entry id="3">...</entry>
  ...
  <entry id="500000">...</entry>
</entries>

...
...
...
...
...
但我只想保留ID介于500和1000之间的条目。我当然会这样做:

let $entries := //entry[(xs:integer(./@id) >= 500) and (xs:integer(./@id) <= 1000)]

让$entries:=//entry[(xs:integer(./@id)>=500)和(xs:integer(./@id)如果
entry
元素按其
id
属性排序(如所提供的文档中所示),大多数XPath(和XQuery)实现应该有效地对此进行评估

/*/entry[position() le 1000 and position() ge 500]

由于您在评论中指出您正在使用eXist db,因此让我提供一些eXist db特定的指导:

  • subsequence()函数的性能将优于大于/小于方法。有关此方法的讨论,请参阅eXist db邮件列表中Wolfgang Meier关于此方法的文章,主题为“优化位置谓词以实现快速分页”。因此,在您的情况下:

    let $entries := subsequence(//entry, 500, 500)
    
    这将使您获得500-1000条条目

  • 如果确实需要执行比较查询(大于/小于),则可能需要在@id上添加范围索引。有关范围索引的详细信息以及如何设置范围索引,请参阅范围索引的eXist db documentation页:


  • 请随意加入eXist db邮件列表;我们总是很乐意讨论优化查询性能的方法。请加入,或在处搜索存档。

    您真的应该说出您使用的XQuery引擎。有些可能对此进行了优化,而另一些则没有……而且几乎所有人在创建DOM时都会以任何方式迭代所有实体。确实如此事实上,我想知道java中是否有类似于
    break;
    的东西。