欢迎!有关如何操作的更多信息,请参阅 关于 页面。
我知道当前生成缩进输出的方法有点像是一种黑客式的方法。我开始了寻找一个可以附加的缩进 XMLStreamWriter。我不确定最好的集成方法,所以我还没有做那部分,但是我包括了一个演示,这是 clojure.data.xml/emit 和 clojure.data.xml.jvm.emit/write-document 的一种黑客式版本。目前似乎没有合适的位置插入封装的 IndentingWriter,所以这是一个需要解决的问题。但是请随意使用这个贡献来实现这一功能。
评论者: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