请在 2024 年 Clojure 状态调查!分享您的想法。

欢迎!有关如何使用本站的信息,请参阅 关于 页面。

0
data.xml

添加 NodeJS 对 ClojureScript 的支持将是非常棒的!看起来 data.xml 使用的是 DOMParser,它在浏览器中可以工作,但在 NodeJS 中则不行。

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

我查看了代码,看起来 xmldom 是在运行 ClojureScript 测试时被替换进 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

也许第一个选项更可取。

未知数(至少对我来说):如何“导出” xmldom npm 依赖项,以便在库的下级项目中可用。

9 个答案

0

评论人:bendlas

为了实现这一点,我想通过使用 sax.js 解析器来启用 ClojureScript 的流式 XML 实现。

使用 js/DOMParser 只是为了浏览器中等小文件的卓越性能所作的妥协,这不是我想带到没有本地实现且可能处理较大文件的 NodeJS 中的东西。

我愿意为更好地处理各种 DOM 类提供更好的支持,包括 Java 的 org.w3c.dom,除非要实际交付与 data.xml 一起使用的 DOM 解析器。如果您现在想在 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示例,我预计它应该在调用final .close之前允许进行多个.write调用,并传入部分块

有哪些好的流式Node解析器选项可以构建在它们的之上?

我所找到的所有各种流式解析器都是基于sax-js构建的,所以我将选择它。

对使用懒序列的流式处理的支持将非常好!

关键是:懒序列在JavaScript中不是IO的选项,因为JavaScript中的一切都是非阻塞的。所以在Java中,你可以愉快地阻塞你的线程,等待懒序列的.next中的输入,但在JavaScript中你无法这样做。据推测,Node.js中可能有阻塞IO的选项,但是由于Node程序的单线程性质,这仍然很糟糕。这也是为什么没有JS的XML Pull API(StAX)存在的理由。

data.xml是基于StAX构建的,因为它非常适合懒序列,因为当时在Clojure中进行流式处理的首选方式就是这样。另一方面,SAX是一个推送模型,这对于JavaScript来说是一个很好的选择,因为你的程序是由输入IO驱动的。
最近,Clojure通过transducers为推送流提供了坚实的支持。我在思考基于transducers构建data.xml的可能性,这样就可以统一支持StAX和SAX源。作为额外的好处,这有可能通过减少中间分配来使data.xml更快。

0

评论人:bendlas

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

以防有人想看看/或帮忙

0

评论由:alza 撰写

嗨(链接:~bendlas),

我想知道,这种新的推送方法是否允许在解析过程中高效地跳过空白字符?因为在使用当前ClojureScript xmldom实现时,我不得不再次扫描解析后的xml来移除空白字符,这比Clojure的副本慢了不少,Clojure副本似乎通过“跳过空白”选项(尽管我在文档中没有看到这一点)支持在解析过程中跳过空白。

谢谢!

Alex。

0
来自

评论人:bendlas

我还想问问这种新的推送方法是否允许在解析过程中高效地跳过空白字符?

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

在sax分支上,我增加了一个名为PushHandler(类似于可变transducer)的协议,并在代码的许多相关位置增加了对该协议的支持。您可以在以下链接中看到它的实际应用: https://github.com/clojure/data.xml/blob/ac9aa0f711861ee8152ddf18e89a18c1d3538b00/src/main/clojure/clojure/data/xml/js/push.cljs#L184

有了它,您可以构建超级高效的转换器样式xml转换器。

但仍有许多事情要做

  • 大量的清理、文档和测试
  • API
  • 简化拉取和推送的交叉操作和常见架构
  • 将process.clj移植到这种处理风格
  • 在阻塞的nodejs流上提供懒拉取接口

我很乐意接受任何测试或反馈!

0
来自

评论由:alza 撰写

嗨(链接:~bendlas),

我愿意帮助完成对顶层API的“终端用户”测试,实际上我已经有一个在Clojure和ClojureScript中同时使用data.xml的真实世界应用程序: https://github.com/digital-dj-tools/dj-data-converter

我对“简化拉取和推送的交叉操作和常见架构”特别感兴趣,因为我将需要在同一项目中支持Clojure(拉取)和ClojureScript(推送)API。

谢谢!

0
来自

评论人:bendlas

太棒了!

我已经在这里通过同步和异步流在node上进行了解析原型的演示: https://github.com/clojure/data.xml/commit/719af453ab2c90352cf72a84f2e42161bf3a8e49

异步流可以被做成一种可还原的-到-承诺的事件源。
同步流甚至允许使用与JVM相同的基于懒序列的解析器。

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

我还想将它改编成适用于XMLHttpRequest - 浏览器中的流,更新API,然后就可以合并了。

当发生这种情况时,我会在这里发帖。

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