评论者:bendlas
sax-js似乎不支持流式处理。
我不确定我是否理解:SAX实际上代表“XML流式API”,查看其README示例,我本以为它应该在调用final .close之前允许多次.write调用和部分块。
有什么好的选择,可以建立在流式Node解析器之上?
我所找到的所有各种流式解析器都是在sax-js之上构建的,所以我会选择这个。
使用懒模式序列的流式支持会很好!
这里的关键是:懒模式序列在JS中的IO并不是一个真正可行的选择,因为所有操作都是非阻塞的。所以,在Java中,你可以在等待lazy-seq中的.next时的输入时阻塞你的线程,但在JS中你不能这么做。大概在Node.js中也有阻塞IO的选项,但它由于Node程序的单线程特性仍是糟糕的。这也是为什么JS中不存在XML拉取API(StAX)的原因。
data.xml是由StAX构建的,因为这与懒模式序列很自然地吻合,并且那时Clojure中进行流式处理的首选方式。另一方面,SAX是一个 pushed 模式,非常适合JS,因为你的程序是由传入的IO驱动的。
最近,Clojure通过转换器(transducers)获得了对推送流的强大支持。我在思考如何在data.xml的基础上建立在转换器的基础之上,这样StAX和SAX源可以统一支持。作为额外的奖励,这有可能使data.xml更快,因为减少了中间分配。