2010-03-17 12 views
6

Sotto andata e ritorno produce invaild xml in quanto il risultato non è preceduto da escape, vale a dire che i valori degli attributi contengono 'invece di apos ;. Sto facendo qualcosa di sbagliato o si tratta di un bug?Roundripping xml in Clojure utilizzando clojure.xml/parse e 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

Per quanto posso dire, questo è ancora un bug con 'xml/emit' in Clojure 1.2. –

risposta

8

Ho controllato la fonte in modo rapido e clojure.xml/emit-element (che viene chiamato da clojure.xml/emit) non fa nessuno sforzo qualunque cosa per codificare i caratteri come entità XML; in effetti, lascia passare i valori degli attributi. Immagino che questo significhi che lo clojure.xml sia piuttosto limitato nella sua usabilità; dovresti usare invece clojure.contrib.lazy-xml. Le mie scuse per non averlo menzionato nella risposta alla tua prima domanda sull'emissione XML, non mi sono reso conto che cose del genere sarebbero accadute.

Con clojure.contrib.lazy-xml, è possibile effettuare le seguenti operazioni:

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

Se davvero si voleva utilizzare clojure.xml, che avrebbe dovuto trasmettere clojure.xml/emit e utilizzare un produttore XML di vostra scelta, invece. Bene, in realtà, è possibile utilizzare clojure.xml/parse, manipolare il risultato, quindi passarlo a clojure.contrib.lazy-xml/emit; la struttura della rappresentazione Clojure dell'XML è la stessa con entrambe le librerie, ma solo quest'ultima emette correttamente.