评论者:bendlas
看来sax-js不支持流式操作 ..
我不太明白:SAX实际上是“XML流式API”的缩写,从其README示例来看,我原本以为它应该在调用final .close之前允许多次.write调用和部分数据块
对于构建在之上的流式Node解析器,有哪些好的选项?
我找到的所有各种流式解析器都是建立在sax-js之上,所以我将选择它。
用懒惰序列提供的流式支持将非常好!
关键在于:在JS中,由于一切都是非阻塞的,所以懒序列并不真正是IO选项。所以,虽然在你使用lazy-seq的.next等待输入时,你可以在Java中开心地阻塞线程,但在JS中你不能这样做。可能Node.js中存在阻塞IO的选项,但这将是Node.js特有的,并且由于Node程序的单线程特性而非常糟糕。这也是在JS中不存在XML拉取API (StAX) 的原因。
data.xml是基于StAX构建的,因为它与懒序列很自然的匹配,并且因为这是当时clojure中进行流式处理的首选方式。另一方面,SAX是一种推模型,对于JS来说是很好的选择,因为程序是由传入的IO驱动的。
最近,clojure在形式上获得了对推流的支持,即transducers。我正在考虑将data.xml基于transducers进行重构,以便统一支持StAX和SAX源。作为一个惊喜,这有可能使data.xml更快,因为它减少了中间分配。