下面的往返生成invaild xml,因为结果没有正确转义,即属性值包含’而不是’.我做错了什么或这是一个错误吗?
(ns xml-test (:require [clojure.xml :as xml]) (:require [clojure.zip :as zip])) (def test-xml "<?xml version="1.0" encoding="UTF-8"?> <main> <item attr=''test''> </item> </main>") (def s (ByteArrayInputStream. (.getBytes test-xml "UTF-8"))) (xml/emit (zip/root (zip/xml-zip (clojure.xml/parse s)))) output: <?xml version='1.0' encoding='UTF-8'?> <main> <item attr=''test''/> </main> nil
我已经快速检查了源代码并且clojure.xml / emit-element(由clojure.xml / emit调用)不会将任何字符编码为XML实体.实际上,它允许直接通过属性值.我想这意味着clojure.xml的可用性非常有限;你应该使用clojure.contrib.lazy-xml.我很抱歉在你关于XML发射的第一个问题的答案中没有提到它,我没有意识到这样的事情会发生.
使用clojure.contrib.lazy-xml,您可以执行以下操作:
user> (lazy-xml/emit (lazy-xml/parse-trim (java.io.StringReader. "<foo bar=\"'""'\"/>"))) <?xml version="1.0" encoding="UTF-8"?><foo bar="'""'"/>
如果你真的想使用clojure.xml,你必须传递clojure.xml / emit并使用你选择的XML生成器.好吧,实际上,你可以使用clojure.xml / parse,修改结果,然后将它传递给clojure.contrib.lazy-xml / emit; XML的Clojure表示结构与两个库相同,但只有后者才能正确发射.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。