2024 Clojure的调查问卷!分享您的想法。

欢迎!请访问关于页面获取有关它是如何工作的更多信息。

0
data.xml

为ClojureScript添加NodeJS支持会很好!看起来data.xml使用了DOMParser,它将在浏览器中工作,但不在NodeJS中。

我查看了原始问题DXML-29,那里提到了NodeJS(使用xmldom),但我想NodeJS的支持最终并未实现?

我查看了代码,它似乎会在运行ClojureScript测试时用xmldom替换DOMParser,所以根据这一点它应该可以工作?尽管测试是在Nashorn而不是NodeJS上运行的。不过我无法确定xmldom是从哪里来的。

可能的解决方案

1) 在代码中添加一些逻辑,例如“尝试创建DOMParser,如果出错则尝试创建xmldom”。
2) 在所有地方使用xmldom(显然可以在非NodeJS的JavaScript平台上使用它),但我对此了解不够。一些信息在这里:https://github.com/jindw/xmldom/wiki/How-to-use-xmldom-in-non-node.js-JavaScript-platforms-like-Rhino-or-SpiderMonkey

可能选项1) 更合适。

未知(至少对我来说):如何“导出”xmldom的npm依赖项,使其对使用该库的下游项目可用..

9 个答案

0

评论者:bendlas

为此要发生,我想通过使用sax.js解析器,启用ClojureScript的流式XML实现。

使用js/DOMParser是对其在小文件中的压倒性性能的一种让步。这不是我愿意在没有本地实现且可能处理较大文档的NodeJS中引入的东西。

我对提高处理各种DOM类的支持持开放态度,这也包括java的org.w3c.dom,但不需要提供实际的DOM解析器与data.xml一起。如果您现在想在NodeJS中使用data.xml,可以考虑使用xmldom + clojure.data.xml/element-data直接。

0

评论者:alza

嗨(链接:~bendlas)

使用 lazy seqs 的流式支持将会非常棒!

我目前在 Node 上使用 data.xml 和 xmldom 进行处理,对于我正在处理的 ~10mb 的 XML 文档来说,相当慢。可能是由于 xmldom 仅支持字符串解析造成的。它似乎要比在 JVM 上使用流式的相同代码慢约 10 倍。

有哪些好的选项来基于流式 Node 解析器构建呢?

sax-js 似乎不支持流式处理。

0

评论者: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 变得更快,因为减少了中间分配。

0

评论者:bendlas

我在这里已经开始工作了 https://github.com/clojure/data.xml/tree/sax

如果有人想看看并/或帮忙的话

0

评论者:alza

您好(链接:~bendlas),

谢谢!

Alex。

0

评论者:bendlas

是的,以及其他转换(例如https://dev.clojure.org/jira/browse/DXML-50

仍有许多工作要做

  • 许多清理、文档化和测试
  • API
  • 优化 pull <-> push 交叉和通用架构
  • 将 process.clj 转换为这种处理方式
  • 在阻塞的nodejs流之上提供懒情 pull 接口

我很高兴得到任何测试或反馈!

0

评论者:alza

您好(链接:~bendlas),

谢谢!

0

评论者:bendlas

太棒了!

我在此使用同步和异步流在Node上进行了解析原型设计:[链接](https://github.com/clojure/data.xml/commit/719af453ab2c90352cf72a84f2e42161bf3a8e49)

异步流可以被制作成一种可归约的 - 到 - Promise 事件源。
同步流甚至允许使用与JVM相同的基于 lazy-seq 的解析器。

两者都可以解析成元素树。

我还希望将其应用于 XMLHttpRequest - 浏览器中的流,更新相应API,然后进行合并。

当它发生时,我会在这里提醒大家。

0
by
参考:[链接](https://clojure.atlassian.net/browse/DXML-60)(由 alex+import 报告)
...