欢迎!有关如何使用本网站的更多信息,请参阅关于页面。
我知道当前生成缩进输出的方法是有点像恶搞。我开始了一个寻找,想创建一个附带的缩进 XMLStreamWriter。我不确定如何将其集成到 data.xml 中,所以我尚未完成这部分工作,但我包括了一个演示,这是 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 接口似乎在简单的文本节点转换器中的一个意外复杂性,因为缺乏可流式的数据模型。幸运的是,从一开始数据.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