【发布时间】: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>
我想以流式方式处理每个<doc>,所以我的解析器显然必须等到它遇到<doc> 开始事件,缓冲所有内容直到等效的</doc> 结束事件,并发出一个NodeSeq完成的元素,然后刷新其缓冲区。
这将如何与 Play BodyParser 一起工作,我不完全确定。如果我能进一步澄清我想要做什么,会得到更多更新!
虽然整个 XML 文件很大,但每个 <doc /> 元素本身都非常小,尽管我显然必须检查字节缓冲区是否超过特定大小。
【问题讨论】:
-
您需要正确地重新分块您的 NodeSeq,它们之间是否有任何分隔符?你怎么知道一个 NodeSeq 是完整的?
-
嗨@Sadache - 我希望在这方面澄清了我的问题,感谢您的关注。
-
嗨,你终于找到解决办法了吗?
-
@Loic 我最终采用了另一种方法来满足这里的迫切需要,所以不能说我做到了。然而,这是不久前的事了,现在有更多的例子,如果这在某处被覆盖,我不会感到惊讶。现在我对 Play 有点熟悉了,我可能很快就会自己再去一次。
标签: scala xml-parsing streaming playframework-2.0 iterate