Scala Play Framework 2.0 BodyParser-推式解析XML流

Scala Play Framework 2.0 BodyParser-推式解析XML流,scala,xml-parsing,streaming,playframework-2.0,iterate,Scala,Xml Parsing,Streaming,Playframework 2.0,Iterate,我觉得问这个问题有点不切实际,因为尽管阅读了这些问题中的内容和相关资源: 。。。我对迭代器、枚举器和Play2.0的反应式模型仍然很模糊。但无论如何,我想建立一个web服务,允许我上传大型XML(>100MB)文件,选择某些特定(非交错)节点,处理它们,并将结果流回到客户端 我想我需要做的第一件事是编写一个BodyParser,它获取字节块,将它们提供给XML解析器,并以惰性的方式发出我想要的节点类流,比如说… 有人能提供一些指导和/或例子来说明如何实现这一点吗 更新:更多背景:- 我的XM

我觉得问这个问题有点不切实际,因为尽管阅读了这些问题中的内容和相关资源:

。。。我对迭代器、枚举器和Play2.0的反应式模型仍然很模糊。但无论如何,我想建立一个web服务,允许我上传大型XML(>100MB)文件,选择某些特定(非交错)节点,处理它们,并将结果流回到客户端

我想我需要做的第一件事是编写一个BodyParser,它获取字节块,将它们提供给XML解析器,并以惰性的方式发出我想要的节点类流,比如说

有人能提供一些指导和/或例子来说明如何实现这一点吗

更新:更多背景:-

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

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

某实体
胡说八道。。。
...
...
我希望以流式方式处理每个
,因此我的解析器显然必须等到它遇到
开始事件,缓冲所有内容直到等价的
结束事件,并发出已完成元素的NodeSeq,然后刷新其缓冲区

我不完全确定这将如何与Play BodyParser一起工作。更多更新,如果我可以进一步澄清我想做什么


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

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

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

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

因此,目前我建议使用一个普通的输入流(或读卡器),并将其输入类似于Scales的内容。也许游戏专家可以建议如何从框架中检索流(而不完全处理流)


注意:当前的最终版本很快就要发布了,但下一个主要版本(0.5)将尝试利用这一点,允许从两侧进行部分流处理(非阻塞)。

基于XOM的解析器将接受分块输入,并专门为流式处理大型XML文件而设计。这听起来正是你想要的。

这篇文章描述了你问题的解决方案。

你需要正确地重新调整你的节点,它们之间是否有分隔符?你怎么知道NodeSeq是完整的?嗨@Sadache-我很有希望澄清我在这方面的问题,谢谢你的关注。嗨,你最终找到了解决方案吗?@Loic我最终选择了另一种方法来解决眼前的需要,所以不能说我找到了。然而,这是一段时间以前的事了,现在有更多的例子,如果在什么地方涉及到这一点,我也不会感到惊讶。现在我对Play有点熟悉了,我自己可能很快就会有另一次尝试。aalto-xml异步阅读器似乎非常有趣。在这种情况下,它似乎可以基于连续的
数组[Byte]]
生成
枚举数。aalto xml是否能够处理chuncks(部分xml)?我很想看到一些例子。。。