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

欢迎!有关如何操作的更多信息,请参阅 关于 页面。

0
data.xml

我知道当前生成缩进输出的方法有点像是一种黑客式的方法。我开始了寻找一个可以附加的缩进 XMLStreamWriter。我不确定最好的集成方法,所以我还没有做那部分,但是我包括了一个演示,这是 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 接口似乎是因为缺乏可流式传输的数据模型而造成的附属复杂性。幸运的是,从一开始,data.xml 就是建立在 XML 的流事件模型之上的(链接:3)。我一直计划支持在事件流上的转换器,即树转换器,而缩进将是这种功能的首个绝好用例。

你觉得呢?如果你有兴趣继续深入了解,这里是一个提交(链接:4),它定义了一个为 emit* 定义的 :event-xform 配置选项。

`
(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
提问者:
参考: https://clojure.atlassian.net/browse/DXML-50 (由 alexmiller 提出)
...