2010-03-17 7 views
6

A continuación, la ida y vuelta produce invaild xml ya que el resultado no se escapa correctamente, es decir, los valores de los atributos contienen 'en lugar de apos ;. ¿Estoy haciendo algo mal o es esto un error?Redondeo de xml en Clojure con clojure.xml/analizar y clojure.xml/emitir

(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

Por lo que puedo decir, este sigue siendo un error con 'xml/emit' en Clojure 1.2. –

Respuesta

8

He comprobado la fuente de rápida y clojure.xml/emit-element (que es llamada por clojure.xml/emit) hace ningún esfuerzo para codificar los caracteres como entidades XML; de hecho, permite los valores de los atributos directamente. Supongo que esto significa que clojure.xml es bastante limitado en cuanto a su usabilidad; deberías usar clojure.contrib.lazy-xml en su lugar. Mis disculpas por no mencionarlo en la respuesta a su primera pregunta sobre la emisión de XML, no me di cuenta de que cosas como estas sucederían.

Con clojure.contrib.lazy-xml, puede hacer lo siguiente:

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

Si realmente quería utilizar clojure.xml, que tendría que pasar clojure.xml/emit y utilizar un productor de XML en lugar de su elección. Bueno, en realidad, puede usar clojure.xml/parse, manipular el resultado, luego pasarlo a clojure.contrib.lazy-xml/emit; la estructura de la representación de Clojure del XML es la misma con ambas bibliotecas, pero solo la última hace una emisión adecuada.