2024 Clojure状态调查! 分享你的想法。

欢迎!请查看关于 页面以了解更多关于本网站如何运作的信息。

0
data.xml

添加对 ClojureScript 的 Node.js 支持将非常好!看起来data.xml使用DOMParser,这在浏览器中可以工作,但在 Node.js 中无法工作。

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

我查看了一下代码,它似乎会在运行 ClojureScript 测试时将 xmldom 与 DOMParser“交换”,所以基于这一点,它应该可以工作?尽管测试是在 Nashorn 而不是 Node.js 上运行的。但我没法弄清楚 xmldom 从哪里来。

可能的解决方案

1) 在代码中使用一些逻辑,例如,“尝试创建 DOMParser,如果出错则尝试创建 xmldom”。
2) 在任何地方使用 xmldom(据称它可以用于非Node.js的JavaScript平台,例如Rhino或SpiderMonkey),但我不太了解它。有关信息请参见此处: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 是对浏览器中其卓越性能所做的让步,对于小型文档来说这是一项服务。这不是我希望在 Node.js 中引入的东西,因为 Node.js 没有原生的实现,而且更大的文档可能需要处理。

我愿意得到更好的支持,用于处理各种 DOM 类,包括java的 org.w3c.dom,而无需提供与 data.xml 一起的实际DOM解析器。如果您现在想在 Node.js 中使用 data.xml,请考虑使用 xmldom + clojure.data.xml/element-data。

0

评论者:alza

你好(链接:~bendlas)

使用懒序列的流式支持会非常棒!

我目前在Node中使用xmldom处理data.xml,对于我正在处理的 ~10MB XML 文档来说,速度相当慢。可能是由于xmldom只进行字符串解析。它似乎比在JVM上使用流的方式慢约10倍。

建立流式Node解析器的良好选项有哪些?

sax-js好像不支持流式处理。

0

评论者:bendlas

sax-js好像不支持流式处理。

我不太明白:SAX代表“XML流式API”,查看它的README示例,我预计它应该在调用最终.close之前允许多次.write调用,使用部分数据块。

建立流式Node解析器的良好选项有哪些?

我发现的所有各种流式解析器都是以sax-js构建的,所以我更倾向于使用它。

使用懒序列的流式支持会非常棒!

关键是:在JS中,由于一切都是非阻塞的,所以懒序列并不是IO的一个真正选项。在Java中,当你等待懒序列的.next时,可以快乐地阻塞线程,而在JS中则不能。Node.js可能有阻塞IO的选项,但这仅限于Node,并且由于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的版本相比,Clojure版本似乎支持在解析过程中跳过空格的"skip-whitespace"选项(尽管我没能从文档中看到这一点)。

谢谢!

亚历克斯。

0

评论者: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
  • 简化拉取与推入的交叉和数据架构
  • 将process.clj转换为这种处理方式
  • 在阻塞的nodejs流之上提供懒拉取接口

我很乐意为任何测试或反馈提供帮助!

0

评论者:alza

你好(链接:~bendlas),

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

我特别感兴趣于“简化拉取与推入的交叉和数据架构”,因为我需要在同一个项目中支持Clojure(拉取)和ClojureScript(推入)API。

谢谢!

0

评论者:bendlas

太棒了!

我在这里原形测试了在Node上的解析,使用同步和异步流:https://github.com/clojure/data.xml/commit/719af453ab2c90352cf72a84f2e42161bf3a8e49

异步流可以转化为一种可以被promise事件源归约的形式。
同步流甚至允许与在JVM上相同的基于lazy-seq的解析器。

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

我还想将此方法适应到XMLHttpRequest - 浏览器中的流,更新它的API,然后它可以合并。

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

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