【问题标题】:Declaratively querying large XML files/streams以声明方式查询大型 XML 文件/流
【发布时间】:2011-08-19 08:31:32
【问题描述】:

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

为了说明我想要做什么:维基百科 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 可以轻松完成的事情以及诸如此类的事情(尤其是对于比此 Wikipedia 示例更复杂的文件)是很乏味的,所以我我正在考虑编写一个更通用的库,我很好奇这是否已经存在。

【问题讨论】:

  • XSLT 引擎可能能够有效地执行此操作,具体取决于它的实现方式。
  • 不幸的是,我尝试过的 XSLT 实现(例如 Saxon)并没有成功,但如果你知道一个可行的方法(或者如果我对 Saxon 做错了什么,我会全力以赴,虽然 IIRC 我在其他地方写到它确实需要文件完全在内存中)。

标签: xml xquery


【解决方案1】:

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

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

http://www.xmlsh.org/FunctionsStAX

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 2012-11-16
      相关资源
      最近更新 更多