2010-03-15 14 views
10

Clojures clojure.xml/parse, clojure.zip/xml-zip y clojure.contrib.zip-filter.xml/xml-> son excelentes herramientas para extraer valores de xml, pero ¿qué sucede si quiero? para cambiar el xml (el resultado de clojure.zip/xml-zip) basado en lo que aprendo de xml-> "consultas" y escribir el resultado como xml?Mutación de XML en Clojure

Hubiera esperado que (clojure.contrib.prxml/prxml (clojure.xml/parse xml-content)) escupiera xml, pero ese no es el caso.

Respuesta

5

Actualización: En realidad, para la emisión de XML, lo mejor es utilizar clojure.contrib.lazy-xml/emit, porque clojure.xml/emit es actualmente probable que se rompa cosas! Ver mi comentario a continuación.

(Dejando esta respuesta aquí por ahora como una advertencia.)


Si he entendido bien, la idea central de la cuestión tiene que ver con convertir la representación XML (posiblemente mutado) de nuevo en Texto XML?

Si es así, echar un vistazo a clojure.xml/emit y 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 captura la salida impresa y lo envuelve como una cadena, por alguna razón xml/emit imprime el XML, por lo que es muy útil aquí. Deseará usar emit-element si <?xml version='1.0' encoding='UTF-8'?> no es lo que desea)

+1

Para el beneficio de los futuros lectores: Aparentemente esto es muy limitado en cuanto a su usabilidad, ya que 'clojure.xml/emit' actualmente adopta un enfoque muy ingenuo para su trabajo y, por ejemplo, descuida codificar cosas como entidades XML ... Use 'clojure.contrib.lazy-xml/emit' en su lugar. También vea mi respuesta a la pregunta de seguimiento: http://stackoverflow.com/questions/2463129/roundtripping-xml-in-clojure-using-clojure-xml-parse-and-clojure-xml-emit/2463768#2463768 –

+0

lazy-xml es ahora https://github.com/clojure/data.xml/ – sventechie

7

Puede usar la biblioteca xml-zip para "mutar" XML como lo haría con cualquier otra estructura inmutable de Clojure. Tiene un conjunto completo de funciones de "mutación": (api)

Todos devuelven una cremallera "modificada" completa. Luego puede ir a la parte superior de esa cremallera, y el usuario xml/emitir para imprimir el XML.

Cuestiones relacionadas