评论者:bendlas
sax-js好像不支持流式处理。
我不太明白:SAX代表“XML流式API”,查看它的README示例,我预计它应该在调用最终.close之前允许多次.write调用,使用部分数据块。
建立流式Node解析器的良好选项有哪些?
我发现的所有各种流式解析器都是以sax-js构建的,所以我更倾向于使用它。
使用懒序列的流式支持会非常棒!
关键是:在JS中,由于一切都是非阻塞的,所以懒序列并不是IO的一个真正选项。在Java中,当你等待懒序列的.next时,可以快乐地阻塞线程,而在JS中则不能。Node.js可能有阻塞IO的选项,但这仅限于Node,并且由于Node程序的单线程性质,仍然很糟糕。这也是为什么JS中不存在XML拉取API(StAX)的原因。
data.xml基于StAX构建,因为它是懒序列的天生之选,也因为那时Clojure使用流处理的首选方式是这种方式。另一方面,SAX是一个推模型,非常适合JS,因为你的程序是由传入的IO驱动的。
最近,Clojure已经通过transducers获得了对推流的强大支持。我在研究如何将data.xml建立在transducers之上,以便统一支持StAX和SAX源。作为额外的好处,这有可能使data.xml变得更快,因为它可以减少中间分配。