请分享您的想法,参与 2024 年 Clojure 状态调查!

欢迎!请访问关于 页面获取更多关于如何使用本信息。

0
data.xml
影响版本 0.2.0-alpha2,0.0.8 没有这个问题。

user=> (require '[clojure.data.xml :as xml])
nil
user=> (xml/emit-str {:tag :RDF :attrs {:xmlns "http://www.w3.org/1999/02/22-rdf-syntax-ns"}})
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><RDF></RDF>"

10 答案

0

评论者:bendlas

按预期工作:由于您输出的是一个普通、非命名空间元素,名为 RDF,因此无法设置默认 xmlns。

0

评论者:yegortimoshenko

这是回归。如果您使用 0.0.8 版本的数据.xml 生成以下 XML,则它将破坏您的代码:

`
<?xml version="1.0" encoding="utf-8"?>

<Description about="urn:mozilla:install-manifest">
      <em:id>jid1-3MbuIoOYk03BMg@jetpack</em:id>
</Description>


`

0

评论者:yegortimoshenko

...然后更新到 0.2.0。

0
评论者:bendlas_

0.0.8版本根本不支持xmlns,因此这不算回归(我们甚至不能处理带命名空间的XML)。能够以这种方式发出带命名空间的XML是个意外。

0.2.0版本为XML命名空间定义了语义,其中之一规定{:tag :RDF}总是代表<RDF>(在空命名空间中),以便于组合。请参考README和设计页面了解当前语义http://dev.clojure.org/display/DXML/Namespaced+XML

我们仍在alpha阶段,所以如果您有任何改变语义的想法,请随时说明,并参考当前设计。
0
评论者:bendlas_

顺便说一句,在当前的xmlns支持下,你会这样编写你的片段


(alias-uri 'R "http://www.w3.org/1999/02/22-rdf-syntax-ns")
(emit-str {:tag ::R/RDF})
0
评论者:brutasse_

-alpha5版本会产生带前缀的标签/属性

{{<?xml version="1.0" encoding="UTF-8"?><a:RDF xmlns:a="" rel="nofollow" target="_blank">http://www.w3.org/1999/02/22-rdf-syntax-ns/>}}

如何使用0.2版本生成{{<RDF xmlns="" rel="nofollow" target="_blank">http://www.w3.org/1999/02/22-rdf-syntax-ns}}
0
评论者:bendlas_

既然任何非损坏的xml消费者都不应该关心这个区别,data.xml会随意发出前缀。
但尝试将发出前缀保持在最小,您可以利用这个行为来获得想要的序列化结果。

(alias-uri 'R "http://www.w3.org/1999/02/22-rdf-syntax-ns")
(emit-str {:tag ::R/RDF :attrs {:xmlns "http://www.w3.org/1999/02/22-rdf-syntax-ns"}})

生成

<?xml version="1.0" encoding="UTF-8"?><RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns">
0

评论者:brutasse

谢谢。我们必须应对许多用多种语言编写、以各种方式损坏的XML消费者,因此完全控制输出非常重要。

目前我们已回退到0.0.8版本。我们将看看是否切换到* }记法,但这并不便于阅读。

0

评论者:bendlas

我原本在考虑一个替换机制以应对您的用例。结果是,我在取消这项任务方面犯了错误。请参阅DXML-52以了解原因。

0
参考:https://clojure.atlassian.net/browse/DXML-43(由yegortimoshenko报告)
...