请在 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 版本的 data.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投票
by
评论由:bendlas_ 提供

0.0.8 版本根本不支持 xmlns,因此这不算是一个回归(我们甚至不能完全进行带有命名空间的 XML 的往返)。能够以这种方式发出带有命名空间的 XML 是偶然的。

0.2.0 建立了 XML 命名空间的语义,其中一部分表明 {:tag :RDF} _总是_ 代表 (在空命名空间中),以便便于组合。请查阅 README 和设计页面以了解当前的语义 http://dev.clojure.org/display/DXML/Namespaced+XML

我们仍然处于 -alpha 阶段,所以如果您有关于更改语义的想法,请随时提出您的情况,并参考当前的设计。
0投票
by
评论由:bendlas_ 提供

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


(alias-uri 'R "http://www.w3.org/1999/02/22-rdf-syntax-ns")
(emit-str {:tag ::R/RDF})
0投票
by
评论由: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投票
by
评论由: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报告)
...