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

欢迎!请查看关于页面以了解更多有关此功能的信息。

0
data.xml

添加NodeJS对ClojureScript的支持将会很好!似乎data.xml使用的是DOMParser,这在浏览器中可以工作,但在NodeJS中不能。

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

我查找了代码,并且看起来当运行ClojureScript测试时,会替换DOMParser使用xmldom,所以基于这一点,它应该可以工作?尽管测试是在Nashorn而不是NodeJS上运行的。但我无法找出xmldom是从哪里来的。

可能的解决方案

1) 在代码中使用一些逻辑,例如“尝试创建DOMParser,如果出错则尝试创建xmldom”。
2) 在 everywhere 使用 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

为了实现这一点,我希望建立一个ClojureScript实现流式XML的功能,使用sax.js解析器。

使用js/DOMParser是出于在浏览器中对小文档的压倒性性能的让步。这不是我愿意带到没有原生实现且大型文档可能被处理的地方的。

我对改善处理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中的示例,我本以为它可以允许在调用final .close之前进行多次 .write调用,带上部分的数据块。

有什么好的流式Node解析器选项可以基于它进行开发?

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

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

关键是:懒序列在JS中的IO选项并不是真正可行,因为所有的事情都是非阻塞的。所以在java中,当在懒序列的.next等待输入时,你可以愉快地阻塞线程,而在JS中你不能这样做。大概在Node.js中确实有用于阻塞IO的选项,但这将是Node.js特有的,并且由于Node程序的单线程性质,仍然很糟糕。这也是为什么在JS中不存在XML Pull API(StAX)的原因。

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

0

评论者:bendlas

我开始在这项工作中

如果有任何人想要查看并/或帮助的话

0
has answered by

评论者: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
  • 简化 pull <-> push 交叉和通用架构
  • 将 process.clj 转换为这种处理风格
  • 在阻塞的 nodejs 流之上提供懒的理由接口

对于任何测试或反馈,我都感到非常高兴!

0

评论者:alza

嗨(链接:~bendlas),

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

我特别有兴趣于“简化 pull <-> push 交叉和通用架构”,因为我在同一项目中需要支持 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 报告)
...