评论由:bendlas
sax-js似乎不支持流式解析。
我不太理解:SAX的全称是“Streaming API for XML”,查看其README示例,我本以为它允许在调用final.close之前通过多个.write调用部分块。
有什么好的选择可以基于流式解析器来构建?
我找到的所有各种流式解析器都是基于sax-js构建的,所以我将选择它。
支持懒序列的流式传输将十分出色!
关键是:在JS中,由于一切都是非阻塞的,所以懒序列并不是IO的好选择。在Java中,你可以在lazy-seq的.next等待输入时放心地阻塞线程,但在JS中你不能这样做。据我所知,在Node.js中存在阻塞IO的选项,但这将是Node特有的,并且因为Node程序的单线程性质,这仍然会很糟糕。这也是为什么不存在JS的XML Pull API(StAX)的原因。
data.xml基于StAX构建,因为它与懒序列不谋而合,并且在那时候,这是Clojure中流式处理的首选方式。另一方面,SAX是一种推模型,这对于JS来说是一个很好的选择,因为你的程序是由输入IO驱动的。
最近,Clojure已经获得了对推流的强大支持,形式为transducers。我正在探索基于transducer在data.xml上构建的可能性,这样就可以统一支持StAX和SAX源。作为额外的福利,这有可能使data.xml更快,因为它减少了中间分配。