2010-03-17 8 views
6

के नीचे क्लोजर में राउंडट्रिपिंग xml राउंडट्रिप के नीचे invaild xml उत्पन्न करता है क्योंकि परिणाम सही ढंग से बच नहीं जाता है, यानी विशेषता मानों में 'apos के बजाय' होता है। क्या मैं कुछ गलत कर रहा हूं या यह एक बग है?clojure.xml/parse और 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

जहां तक ​​मैं कह सकता हूं, यह अभी भी क्लोजर 1.2 में 'xml/emit' के साथ एक बग है। –

उत्तर

8

मैं स्रोत देख लिया है और जल्दी से clojure.xml/emit-element (जो clojure.xml/emit से बुलाया जाता है) कोई प्रयास जो कुछ भी एक्सएमएल संस्थाओं के रूप में कोई भी वर्ण एन्कोड करने के लिए बनाता है; वास्तव में, यह सीधे मूल्यों को विशेषता देता है। मुझे लगता है कि इसका मतलब है clojure.xml इसकी उपयोगिता में काफी सीमित है; आपको इसके बजाय clojure.contrib.lazy-xml का उपयोग करना चाहिए। एक्सएमएल उत्सर्जन पर आपके पहले प्रश्न के उत्तर में इसका उल्लेख नहीं करने के लिए मेरी माफी, मुझे ऐसा नहीं पता था कि ऐसा कुछ होगा। आप clojure.xml/emit पर गुजरती हैं और बजाय अपनी पसंद का एक एक्सएमएल निर्माता का उपयोग करना होगा

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.contrib.lazy-xml के साथ, आप निम्न कर सकते हैं। खैर, वास्तव में, आप clojure.xml/parse का उपयोग कर सकते हैं, परिणाम को उलझाना, फिर इसे clojure.contrib.lazy-xml/emit पर पास कर दें; एक्सएमएल के क्लोजर प्रस्तुति की संरचना दोनों पुस्तकालयों के साथ समान है, लेकिन केवल उत्तरार्द्ध उचित उत्सर्जन करता है।

संबंधित मुद्दे