请分享您的看法,参加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

为此,我希望能启用ClojureScript的流式XML实现,使用sax.js解析器。

使用js/DOMParser是为了它在小文档中的强劲性能而做出的妥协。这不是我愿意在NodeJS中引入的,其中没有本地实现,而且较大文档很可能会被处理。

我乐意在不需要提供实际DOM解析器的情况下获得对各种DOM类更好的支持,这包括java的org.w3c.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中,由于一切都是非阻塞的,所以懒序列并不真正是IO选项。所以,虽然在你使用lazy-seq的.next等待输入时,你可以在Java中开心地阻塞线程,但在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相当的解析过程来说,减慢了解析速度的额外步骤,虽然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转换为这种处理方式
  • 在阻塞的Node.js流之上提供懒惰的pull界面

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

0

评论者:alza

嗨(链接:~bendlas),

我很乐意帮助进行顶层API的“最终用户”测试,其实我有一个现实世界的应用已经在使用Clojure和ClojureScript中的data.xml: 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

异步流可以被转换为一种 reducible - to - promise 事件源。
同步流甚至允许使用与JVM相同的基于lazy-seq的解析器。

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

我还想将此应用于XMLHttpRequest - 浏览器中的流,并更新其API,然后可以将其合并。

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

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