【问题标题】:Play Framework 2.0 BodyParser - push parsing XML streamsPlay Framework 2.0 BodyParser - 推送解析 XML 流
【发布时间】:2012-07-14 06:02:21
【问题描述】:

尽管阅读了official docs 和这些问题中链接的资源,但我觉得问这个问题有点过头了:

How to understand `Iteratee` in play2?

Can't understand Iteratee, Enumerator, Enumeratee in Play 2.0

...总的来说,我对迭代器、枚举器和 Play 2.0 的响应式模型仍然很模糊。但无论如何,我想建立一个 Web 服务,允许我上传大型 XML (>100MB) 文件,挑选某些特定的(非交错的)NodeSeq,处理它们,并将结果流式传输回客户端。

我认为我需要做的第一件事是编写一个 BodyParser,它接收大块字节,将它们提供给 XML 解析器,然后以一种懒惰的方式发出我想要的 NodeSeq 流,比如<doc>...</doc>

谁能提供任何指导和/或示例来说明如何实现这一点?

更新:更多背景:-

我的 XML 实际上是一个 Solr add 文档,所以它看起来像:

<add>
    <doc>
        <field name="name">Some Entity</field>
        <field name="details">Blah blah...</field>
        ...
    </doc>
    ...
</add>

我想以流式方式处理每个&lt;doc&gt;,所以我的解析器显然必须等到它遇到&lt;doc&gt; 开始事件,缓冲所有内容直到等效的&lt;/doc&gt; 结束事件,并发出一个NodeSeq完成的元素,然后刷新其缓冲区。

这将如何与 Play BodyParser 一起工作,我不完全确定。如果我能进一步澄清我想要做什么,会得到更多更新!

虽然整个 XML 文件很大,但每个 &lt;doc /&gt; 元素本身都非常小,尽管我显然必须检查字节缓冲区是否超过特定大小。

【问题讨论】:

  • 您需要正确地重新分块您的 NodeSeq,它们之间是否有任何分隔符?你怎么知道一个 NodeSeq 是完整的?
  • 嗨@Sadache - 我希望在这方面澄清了我的问题,感谢您的关注。
  • 嗨,你终于找到解决办法了吗?
  • @Loic 我最终采用了另一种方法来满足这里的迫切需要,所以不能说我做到了。然而,这是不久前的事了,现在有更多的例子,如果这在某处被覆盖,我不会感到惊讶。现在我对 Play 有点熟悉了,我可能很快就会自己再去一次。

标签: scala xml-parsing streaming playframework-2.0 iterate


【解决方案1】:

扫描文档,它似乎只是收集了这些信息,并为 Java 提供了一个完整的 org.w3c.Document,为 scala 提供了一个 scala.xml:play xml requests

这似乎不太可能对您的情况有所帮助,因为您最终会得到一个大内存模型。对于 100MB 的 xml,您可以期望解析多达 700MB 的使用量。

不幸的是,当前可用的(和已知的)xml 库都不支持按照 Iteratee 模型提供块。 Scales Xml 提供了一种处理流中的块的方法(将拉解析器转换为枚举器) - 有关示例,请参见 here

因此,目前我建议采用普通的 InputStream(或 Reader)并将其输入类似于 Scales 的东西。也许 Play 专家可以推荐如何从框架中检索流(无需完全处理)。

注意:当前的最终版本即将发布,但下一个主要版本 (0.5) 将尝试利用 aalto-xml 来允许双方进行这种部分流处理(非阻塞)。

【讨论】:

  • aalto-xml 异步阅读器似乎很有趣。查看cowtowncoder.com/blog/archives/2011/03/entry_451.html,它似乎可以在这种情况下用于根据连续的Array[Byte]] 生成Enumerator
  • aalto-xml 是否能够处理块(部分 xml)?我很想看看一些例子......
【解决方案2】:

【讨论】:

    【解决方案3】:

    基于 XOM 的 Nux 解析器将接受分块输入,并且专为传输大型 XML 文件而设计。这听起来正是您想要的。

    【讨论】:

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