评论者:bendlas
sax-js 似乎不支持流式处理 ..
我不太明白:SAX 直译就是“XML 的流式API”,查看其 README 示例,我会 expect 它允许在最终调用 .close 之前进行多次 .write 调用,带上部分块。
有哪些好的选项来基于流式 Node 解析器构建呢?
我找到的所有各种流式解析器都是基于 sax-js 构建的,所以我将选择这个。
使用 lazy seqs 的流式支持将会非常棒!
关键在于:在 JS 中,lazyseqs 并不是真正的 I/O 选项,因为一切都不是阻塞的。所以在 java 中,你可以很高兴地阻塞线程,等待 lazy-seq 的 .next,而在 JS 中无法这样做。虽然没有选项能够实现 Node.js 中的阻塞 I/O,但鉴于 Node 程序的单线程特性,这仍旧很糟糕。这也是为什么不存在 JS 中的 XMLPull API(StAX)的原因。
data.xml 基于 StAX,因为这对于 lazy-seq 非常自然,而且这也曾是 clojure 流处理的首选方式。另一方面,SAX 是一种推模型,对于 JS 来说是一种很好的匹配,因为你的程序是由输入驱动的 IO 控制的。
最近,clojure 获取了对推流(transducers)的强大支持。我正在考虑将 data.xml 基于transducer 以实现StAX和SAX来源的整体支持。作为一个额外的好处,这有可能使 data.xml 变得更快,因为减少了中间分配。