请分享您的想法,参与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

这是一个回归问题。如果你使用 data.xml 在版本 0.0.8 中生成以下 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

我们仍在α版本中,所以如果你有修改语义的想法,请随时提出你的观点,并参考当前的设计。
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="http://www.w3.org/1999/02/22-rdf-syntax-ns"/>}}

如何使用0.2版本发出{{<RDF xmlns="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报告)
...