Play Framework 2.0 BodyParser - 推送解析XML流

Mik*_*ame 5 streaming scala xml-parsing iterate playframework-2.0

我觉得这个问题非常深入,因为尽管阅读了这些问题中的官方文档和资源:

如何理解play2中的"Iteratee"?

在Play 2.0中无法理解Iteratee,Enumerator,Enumeratee

...我对迭代器,枚举器和Play 2.0的反应模型一般都很朦胧.但无论如何,我想建立一个Web服务,允许我上传大型XML(> 100MB)文件,选择某些特定的(非交错的)NodeSeq,处理它们,然后将结果流回客户端.

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

任何人都可以提供任何指导和/或说明如何实现这一目标的例子吗?

更新:更多背景: -

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

<add>
    <doc>
        <field name="name">Some Entity</field>
        <field name="details">Blah blah...</field>
        ...
    </doc>
    ...
</add>
Run Code Online (Sandbox Code Playgroud)

我想以<doc>流方式处理每个,所以我的解析器显然必须等到它达到<doc>启动事件,缓冲一切直到等效的</doc>结束事件,并发出完成元素的NodeSeq,然后刷新其缓冲区.

如何使用Play BodyParser,我不完全确定.如果我可以进一步澄清我想做的事情,可以获得更多更新!

尽管整个XML文件很大,但每个<doc />元素本身都很小,但我显然必须检查字节缓冲区是否超过一定大小.

小智 3

扫描文档,它似乎只是收集这些信息并为 Java 提供整个 org.w3c.Document 和为 scala 提供 scala.xml :播放 xml 请求

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

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

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

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