2010-03-17 4 views
6

Unter Roundtrip erzeugt invaild xml, da das Ergebnis nicht korrekt maskiert ist, d. H. Die Attributwerte enthalten 'statt Apos ;. Mache ich etwas falsch oder ist das ein Fehler?Roundtripping xml in Clojure mit clojure.xml/parse und 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

Soweit ich das beurteilen kann, ist dies immer noch ein Fehler mit 'Xml/emit' in Clojure 1.2. –

Antwort

8

ich die Quelle überprüft haben schnell und clojure.xml/emit-element (die durch clojure.xml/emit aufgerufen wird) macht keine Mühe, was alle Zeichen als XML-Entitäten zu codieren; in der Tat, es lässt Werte direkt durch. Ich denke, das bedeutet clojure.xml ist in seiner Benutzerfreundlichkeit ziemlich begrenzt; Sie sollten stattdessen clojure.contrib.lazy-xml verwenden. Ich entschuldige mich dafür, dass ich in der Antwort auf Ihre erste Frage zu XML nicht erwähnt habe, dass mir nicht klar war, dass so etwas passieren würde.

Mit clojure.contrib.lazy-xml, können Sie folgendes tun:

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;'"/> 

Wenn Sie wirklich verwenden clojure.xml wollten, müssten Sie auf clojure.xml/emit passieren und eine XML-Hersteller Ihrer Wahl verwenden statt. Nun, eigentlich können Sie clojure.xml/parse verwenden, das Ergebnis nicht bearbeiten und dann an clojure.contrib.lazy-xml/emit übergeben; Die Struktur der Clojure-Repräsentation des XML ist mit beiden Bibliotheken identisch, aber nur die letztere tut das richtige Emittieren.