Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
声明式查询大型XML文件/流_Xml_Xquery - Fatal编程技术网

声明式查询大型XML文件/流

声明式查询大型XML文件/流,xml,xquery,Xml,Xquery,这里是在黑暗中拍摄的,但是是否有任何库或工具用于声明式查询大型(>>内存)XML文件(以流式方式) 为了说明我想做什么:Wikipedia XML转储看起来像: ... <page> <title>AccessibleComputing</title> <id>10</id> <redirect /> <revision> <id>233192</

这里是在黑暗中拍摄的,但是是否有任何库或工具用于声明式查询大型(>>内存)XML文件(以流式方式)

为了说明我想做什么:Wikipedia XML转储看起来像:

...
  <page>
    <title>AccessibleComputing</title>
    <id>10</id>
    <redirect />
    <revision>
      <id>233192</id>
      <timestamp>2001-01-21T02:12:21Z</timestamp>
      <contributor>
        <username>RoseParks</username>
        <id>99</id>
      </contributor>
      <comment>*</comment>
      <text id="233192" bytes="124" />
    </revision>
    <revision>
      <id>862220</id>
      <timestamp>2002-02-25T15:43:11Z</timestamp>
      <contributor>
        <ip>Conversion script</ip>
      </contributor>
      <minor/>
      <comment>Automated conversion</comment>
      <text id="862220" bytes="35" />
    </revision>
...
如果我能按照这些思路做点什么(重新调整XPath/XQuery语法的用途),那就太棒了:

这些类型的查询实际上应该只占用常量内存(对于固定深度的XML),基本上只需要保留一个元素堆栈

我尝试了一些XQuery/XSLT实现,包括Saxon和Galax,但它们都让我记忆犹新


目前,我正在编写一个SAX事件解析器,但维护我们正在遍历的节点堆栈和重新实现XPath轻松完成的功能(尤其是对于比这个Wikipedia示例更复杂的文件)是非常繁琐的,因此,我正在考虑编写一个更通用的库,我很好奇这个库是否已经存在。

该库声称以流媒体方式支持XQuery。以下是解决方法。

您可以尝试使用StAX库而不是SAX。 StAX是一个拉而不是推的库,所以它更容易跟踪状态。但这不是xquery

您可能还对xmlsh中的StaX支持感兴趣,它非常有效,但比直接用Java编写要容易得多(代码编写更少)


XSLT引擎可能能够有效地实现这一点,这取决于它的实现方式。不幸的是,我尝试过的XSLT实现(如Saxon)并没有成功,但如果你知道一个有效的XSLT实现,我会洗耳恭听(或者如果我对Saxon做了一些错误的事情,尽管我在其他地方写的IIRC中发现它确实要求文件完全在内存中)。
revisionid,pageid,username,userid,textsize
233192,10,RoseParks,99,124
...
for $p in /page
  for $r in $p/revision[contributor/username]
    return $r/id/text(),
           $p/id/text(),
           $r/contributor/username/text(),
           $r/contributor/id/text(),
           $r/text/@bytes