2010-03-17 41 views
6

由於結果未正確轉義,因此以下往返產生invaild xml,即屬性值包含'而不是'。我做錯了什麼或者這是一個錯誤?使用clojure.xml/parse和clojure.xml在Clojure中繞行xml/emit

(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='&apos;test&apos;'> </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 
+1

據我所知,這仍然是Clojure 1.2中'xml/emit'的錯誤。 – 2011-05-22 21:03:54

回答

8

我趕緊檢查了源和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=\"&apos;&quot;&quot;&apos;\"/>"))) 
<?xml version="1.0" encoding="UTF-8"?><foo bar="'&quot;&quot;'"/> 

如果你真的想使用clojure.xml,你必須傳遞clojure.xml/emit並使用您選擇的XML生產來代替。實際上,你可以使用clojure.xml/parse,結果是mangle,然後傳給clojure.contrib.lazy-xml/emit; XML的Clojure表示的結構與兩個庫都是相同的,但只有後者才能正確發佈。