scala – Play Framework 2.0 BodyParser – 推送解析XML流
我觉得这个问题非常深入,因为尽管阅读了
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> <doc> <field name="name">Some Entity</field> <field name="details">Blah blah...</field> ... </doc> ... </add> 我想处理每个< doc>以流方式,所以我的解析器显然必须等到它达到< doc>启动事件,缓冲所有内容,直到等效的< / doc>结束事件,并发出已完成元素的NodeSeq,然后刷新其缓冲区. 如何使用Play BodyParser,我不完全确定.如果我可以进一步澄清我想做的事情,可以获得更多更新! 虽然整个XML文件很大,但每个< doc />元素本身很小,但我显然必须检查字节缓冲区是否超过一定的大小. 解决方法
扫描文档似乎它只是收集此信息并为Java提供整个org.w3c.Document,为scala提供scala.xml:
play xml requests
这似乎不太可能对你的情况有所帮助,因为你最终会得到一个大内存模型.对于100MB的xml,您可以期望解析任何高达700MB的使用量. 遗憾的是,根据Iteratee模型,当前可用的(和已知的)xml库都不支持以块的形式进行馈送. Scales Xml提供了一种从流处理块的方法(将拉解析器转换为枚举器) – 有关示例,请参阅here. 因此,我建议采用普通的InputStream(或Reader)并将其输入类似于Scales的东西.也许Play专家可以推荐如何从框架内检索流(不完全处理它). 注意:目前的决赛即将结束,但下一个主要版本(0.5)将尝试利用aalto-xml来允许双方的这种部分流处理(非阻塞). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |