2010-03-15 18 views
10

Clojure clojure.xml/parse, clojure.zip/xml-zip e clojure.contrib.zip-filter.xml/xml-> sono strumenti eccellenti per estrarre valori da xml, ma cosa succede se voglio cambiare l'xml (il risultato di clojure.zip/xml-zip) in base a ciò che imparo da xml-> "query" e scrivere il risultato come xml?Mutating XML in Clojure

Mi sarei aspettato che (clojure.contrib.prxml/prxml (clojure.xml/parse xml-content)) restituisse xml, ma non è questo il caso.

risposta

5

Aggiornamento: In realtà, per l'emissione di XML, è meglio usare clojure.contrib.lazy-xml/emit, perché clojure.xml/emit è attualmente rischia di rompere le cose! Vedi il mio commento qui sotto.

(Lasciando questa risposta qui per ora come un avvertimento.)


Se ho capito bene, la spinta principale della domanda ha a che fare con girando la (forse mutato) rappresentazione XML di nuovo in Testo XML?

Se è così, uno sguardo ai clojure.xml/emit e clojure.xml/emit-element:

user> (with-out-str (xml/emit {:tag :foo :attrs {:bar "quux"}})) 
"<?xml version='1.0' encoding='UTF-8'?>\n<foo bar='quux'/>\n" 

(with-out-str cattura la stampa e lo avvolge come una stringa; per qualche motivo xml/emit stampa il xml, quindi è utile qui. Ti consigliamo di utilizzare emit-element se <?xml version='1.0' encoding='UTF-8'?> non è quello che desideri.)

+1

Per il beneficio dei futuri lettori: Apparentemente questo è molto limitato nella sua usabilità, poiché 'clojure.xml/emit' adotta attualmente un approccio molto ingenuo al suo lavoro e ad es. trascura di codificare roba come entità XML ... Usa invece 'clojure.contrib.lazy-xml/emit'. Vedi anche la mia risposta alla domanda di follow-up: http://stackoverflow.com/questions/2463129/roundtripping-xml-in-clojure-using-clojure-xml-parse-and-clojure-xml-emit/2463768#2463768 –

+0

lazy-xml è ora https://github.com/clojure/data.xml/ – sventechie

7

Puoi usare la libreria xml-zip per "mutare" XML proprio come faresti con qualsiasi altra struttura immutabile di Clojure. Ha un set completo di funzioni "mutanti": (api)

Tutti restituiscono un'intera cerniera "modificata". È quindi possibile andare all'inizio di quella cerniera e l'utente xml/emit per stampare l'XML.