分享您的想法,请参与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之外的平台中使用它),但我对它了解不多。更多信息在这里: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)

支持使用懒序列的流将会很棒!

我目前使用 Node 的 data.xml 和 xmldom,对于我正在处理的 ~10mb XML 文档来说,速度相当慢。这可能是由于 xmldom 只进行字符串解析导致的。它似乎比在可以使用流的 JVM 上运行相同的代码慢大约 10 倍。

对于构建在流式 Node 解析器上的优秀选项有哪些?

sax-js 似乎不支持流..

0
发表者:

评论者: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 的速度。

0
发表者:

评论者:bendlas

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

如果有人想查看和/或帮忙

0
发表者:

评论由:alza 提供

嗨(链接:~bendlas),

我想知道这种新的推送方法是否可以在解析过程中高效地跳过空格?因为使用当前的ClojureScript xmldom实现,我不得不再次扫描已解析的XML以删除它,这又是一个与Clojure的等效版本相比减慢解析速度的额外步骤,后者似乎支持在解析过程中通过“skip-whitespace”选项跳过空格(尽管我在文档中没有看到此项提到)。

谢谢!

亚历克斯。

0
by

评论者:bendlas

我想知道这种新的推送方法是否可以在解析过程中高效地跳过空格?

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

在SAX分支上,我添加了一个名为PushHandler(类似于可变参数的转换器)的协议,并将其添加到代码中相关的多数地方。您可以在以下位置看到它的实际效果:https://github.com/clojure/data.xml/blob/ac9aa0f711861ee8152ddf18e89a18c1d3538b00/src/main/clojure/clojure/data/xml/js/push.cljs#L184

有了这个,您可以帮助构建超级高效的转换器样式XML转换器。

仍有许多零散的工作要做

  • 大量的清理、文档和测试
  • API
  • 简化pull <-> push转换和通用架构
  • 将process.clj转换为这种处理风格
  • 在阻塞的nodejs流之上提供懒pull接口

我非常期待任何测试或反馈!

0
by

评论由:alza 提供

嗨(链接:~bendlas),

我很乐意帮助对顶层API进行“最终用户”测试,实际上我已经有一个实际用于在Clojure和ClojureScript中均使用data.xml的实体应用: https://github.com/digital-dj-tools/dj-data-converter

我尤其对“简化pull <-> push转换和通用架构”感兴趣,因为同一个项目将需要同时支持Clojure(pull)和ClojureScript(push)API。

谢谢!

0
by

评论者:bendlas

太好了!

我已经在这里对Node的解析进行了原型设计,包括同步和异步流: https://github.com/clojure/data.xml/commit/719af453ab2c90352cf72a84f2e42161bf3a8e49

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

两者都已被解析为元素树。

我还想为此原型设计适用于XMLHttpRequest - 浏览器中的流,并更新相应的API,然后就可以合并了。

当那发生时,我会再次在这里进行ping。

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