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

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

0
data.xml

我知道当前生成缩进输出的方法是有点像恶搞。我开始了一个寻找,想创建一个附带的缩进 XMLStreamWriter。我不确定如何将其集成到 data.xml 中,所以我尚未完成这部分工作,但我包括了一个演示,这是 clojure.data.xml/emit 和 clojure.data.xml.jvm.emit/write-document 的一个修改版本。我认为目前没有在插入包裹 IndentingWriter 的干净地方,所以这是一个需要解决的问题。但请随意使用这个贡献来实现这个功能。

2答案

0

评论者:bendlas

嗨 Alex,

感谢您提出这个问题!当前糟糕的缩进实现一直困扰着我。

也感谢您实现了一个缩进的 java.xml.stream.XMLStreamWriter。在详细讨论如何将您的代码集成,或哪些选项可以用于配置引入它之前,让我先提出一些可解决的问题,这些问题与本票相关:
- 高效地缩进 XML,理想情况下是跨平台的
- 通过配置来替换 XMLStreamWriter,以及可能的其他一些小小的解析/输出的缺陷

为了本评论(以及希望是票)的目的,我将专注于“高效缩进 XML”这一部分。

对于仅适用于 JVM 的解决方案,我们应该有一个报告,关于在滚动我们自己的之前,是否有可能(例如)将 StAXSource (链接:1)连接到缩进转换器(链接:2)。另一方面,如果 cljs 也能从中受益,那么自己滚动流式转换器是有意义的,即使这可以通过 JVM 后端的其他方法实现。

如果你仔细观察一下你的 c.d.xml.jvm.indent 命名空间,你可能会注意到该命名空间中包含的转换器正在发亮。XMLStreamWriter 接口似乎在简单的文本节点转换器中的一个意外复杂性,因为缺乏可流式的数据模型。幸运的是,从一开始数据.xml 就是基于 XML 的流事件模型(链接:3)构建的。我一直在计划支持树形转换,以事件流的转换器形式,而缩进将是一个极好的首次用例。

您怎么看?如果您有兴趣进一步发展这一点,这里有定义在 emit* 中为 :event-xform 配置选项的提交(链接:4)。

`
(emit-str (parse-str "bar lala <br/> gag"))

      :event-xform (fn [xf]
                     (fn
                       ([s] (xf s))
                       ([s {:as e :keys [str]}]
                        (-> s
                            (cond-> str (xf (clojure.data.xml.event/->CharsEvent "^.^")))
                            (xf e))))))

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>^.^bar lala <br/>^.^ gag"
`

(链接:1) https://docs.oracle.com/javase/7/docs/api/javax/xml/transform/stax/StAXSource.html
(链接:2) https://github.com/clojure/data.xml/blob/master/src/main/clojure/clojure/data/xml/jvm/pprint.clj#L15
(链接:3) https://github.com/clojure/data.xml/blob/master/src/main/clojure/clojure/data/xml/event.clj
(链接:4) https://github.com/bendlas/data.xml/commit/0c2baa690154bfa731fa1f98a539542a0205e6b1

0
by
参考: https://clojure.atlassian.net/browse/DXML-50 (由alexmiller报告)
...