声明性地查询大型XML文件/流

时间:2011-08-19 08:31:33

标签: xml xquery

在黑暗中拍摄,但有没有任何库或工具用于声明性地查询大型(>>内存)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>
...

我想将其转换为CSV,以便我可以导入Postgresql进行进一步分析:

revisionid,pageid,username,userid,textsize
233192,10,RoseParks,99,124
...

如果我可以沿着这些方向做一些事情(重新利用XPath / XQuery语法),那将是非常棒的:

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

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

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

目前我只是编写一个SAX事件解析器,但是维护我们正在遍历的节点堆栈并重新实现XPath轻松做什么以及诸如此类的东西(特别是对于比这个维基百科示例更复杂的文件)是很繁琐的,所以我'我想写一个更通用的库,我很好奇这是否已经存在。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用StAX库而不是SAX。 StAX是一个pull,而不是push库,所以它更容易跟踪状态。它不是xquery。

您可能也对xmlsh中的StaX支持感兴趣,这种支持非常高效但更容易编写代码(编写代码更少),然后直接用Java编写。

http://www.xmlsh.org/FunctionsStAX

答案 1 :(得分:0)

Nux库声称以流式方式支持XQuery。这是API