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

欢迎!请参阅关于页面以获取更多关于如何使用此平台的信息。

0
data.xml

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

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

我在代码中看了看,看起来在运行 ClojureScript 测试时,xmldom 会替换 DOMParser,所以基于此,它应该可以工作?尽管测试是在 Nashorn 而不是 NodeJS 上运行的。然而,我无法找出 xmldom 的来源。

可能的解决方案

1) 在代码中使用一些逻辑,例如:“尝试创建 DOMParser,如果出错尝试创建 xmldom”。
2) 在任何地方使用 xmldom(据称它可以用于 NodeJS 之外的 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 主要是出于其对浏览器中处理小型文档时的卓越性能。这不是我想在 NodeJS 中引入的东西,因为 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构建的,因此我会选择它。

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

关键是:由于JS中的一切都是非阻塞的,因此在JS中懒惰序列并不真的适合IO。而在Java中,你在等待lazy-seq的.next时可以愉快地阻塞线程,而JS中不行。据推测,Node.js中可能有阻塞IO的选项,但那将是Node-only且由于Node程序的单一线程特性而依然非常糟糕。这也是不存在JS XML Pull 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等的跳过解析过程的空白选项而言,会降低解析速度的额外步骤。

谢谢!

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

有了这个,你可以构建超级高效的transducer-style 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(pull)和ClojureScript(push)API。

谢谢!

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 提报)
...