欢迎!请在关于页面了解有关此内容的更多信息。
我知道当前生成缩进输出采用的是一种折衷方案。我开始了创建一个附加的缩进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的解决方案,我们应该有报告(例如)在开发自己的解决方案之前,了解在indenting-transformer(链接:1)中挂载StAXSource(链接: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