评论者:bendlas
sax-js 似乎不支持流 ..
我不太理解:SAX 实际上代表 "XML 流式 API",查看其 README 示例,我本以为它会允许在调用最终 .close 之前进行多个 .write 调用和部分数据块。
对于构建在流式 Node 解析器上的优秀选项有哪些?
我所找到的所有各种流式解析器都是基于 sax-js 构建的,所以我将选择使用它。
支持使用懒序列的流将会很棒!
关键在于:在 JS 中,懒序列并不是 IO 的选择,因为 JS 中一切都是非阻塞的。所以,虽然你在 Java 中可以在懒序列的 .next 等待输入时阻塞线程,而在 JS 中,你不能这样做。据推测,Node.js 中有阻塞 IO 的选项,但这将是 Node.js 独有的,并且由于 Node 程序的单线程特性,这仍然很糟糕。这也是 JS 中存在 XML 拉流 API(StAX)的原因。
data.xml 基于 StAX 构建,因为它是懒序列的自然选择,同时也因为当时在 Clojure 中这是处理流式处理的首选方式。另一方面,SAX 是一种推模式,非常适合 JS,因为你的程序由输入 IO 驱动。
最近,Clojure 得到了对推送流的良好支持,形式为 transducers。我正在探索在 data.xml 上基于 transducers 的可能性,以便可以统一地支持 StAX 和 SAX 源。作为一个额外的优点,这有可能通过减少中间分配来加快 data.xml 的速度。