评论者:bendlas
sax-js似乎不支持流式处理...
我不太确定我理解的对:SAX确实代表“XML流式API”,查看它的README例子,我会预期它允许在调用final .close之前进行多个.write调用并带上部分数据块。
对于构建在流式Node解析器之上的好选项是什么?
我所找到的所有各种流式解析器都是基于sax-js构建的,因此我会选择它。
使用懒惰序列的流式处理支持将非常棒!
关键是:由于JS中的一切都是非阻塞的,因此在JS中懒惰序列并不真的适合IO。而在Java中,你在等待lazy-seq的.next时可以愉快地阻塞线程,而JS中不行。据推测,Node.js中可能有阻塞IO的选项,但那将是Node-only且由于Node程序的单一线程特性而依然非常糟糕。这也是不存在JS XML Pull API(StAX)的原因。
data.xml是基于StAX构建的,因为这与懒惰序列非常吻合,同时也是当时在Clojure中进行流式处理的方法之一。另一方面,SAX是一种推模型,它与JS很适应,因为你的程序是由输入IO驱动的。
最近,Clojure已经通过transducers获得了对推流式处理的支持。我正在考虑在data.xml上基于transducers的可能性,以实现对StAX和SAX源进行统一的支持。作为额外的好处,这有望减少中间分配,从而提高data.xml的效率。