2010-03-15 16 views
10

Clojures clojure.xml/parse, clojure.zip/xml-zip und clojure.contrib.zip-filter.xml/xml-> sind ausgezeichnete Werkzeuge, um Werte aus xml zu ziehen, aber was ist, wenn ich will das xml (das Ergebnis von clojure.zip/xml-zip) basierend auf dem, was ich aus xml-> "queries" gelernt habe, zu ändern und das Ergebnis als xml zurückzuschreiben?Mutieren von XML in Clojure

Ich hätte erwartet, dass (clojure.contrib.prxml/prxml (clojure.xml/parse xml-content)) XML zurückspucken, aber das ist nicht der Fall.

Antwort

5

Update: Eigentlich für XML aussendet, ist es am besten clojure.contrib.lazy-xml/emit zu verwenden, da clojure.xml/emit derzeit wahrscheinlich ist, die Dinge zu brechen! Siehe meinen Kommentar unten.

(Leaving diese Antwort hier nun als Warnung.)


Wenn ich richtig verstehe, die Hauptstoßrichtung der Frage der (möglicherweise mutiert) XML-Darstellung mit dem Drehen zu tun hat, wieder in XML-Text?

Wenn ja, haben Sie einen Blick auf clojure.xml/emit und 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 erfasst gedruckte Ausgabe und wickelt es als String oben, aus irgendeinem Grund xml/emit druckt die xml, so dass es hier praktisch ist. Sie möchten emit-element verwenden, wenn <?xml version='1.0' encoding='UTF-8'?> nicht das ist, was Sie wollen.)

+1

Zum Vorteil der zukünftigen Leser: Offenbar ist dies in seiner Benutzerfreundlichkeit sehr begrenzt, da 'clojure.xml/empt' derzeit eine sehr naive Herangehensweise an seine Aufgabe und z.B. vernachlässigt das Codieren von Stuff als XML-Entitäten ... Verwenden Sie stattdessen 'clojure.contrib.lazy-xml/emit'. Siehe auch meine Antwort auf die folgende Frage: http://stackoverflow.com/questions/2463129/roundtripping-xml-in-clojure-using-clojure-xml-parse-and-clojure-xml-emit/2463768#2463768 –

+0

Lazy-XML ist jetzt https://github.com/clojure/data.xml/ – sventechie

7

Sie können die Xml-zip-Bibliothek verwenden, um XML zu "mutieren", genau wie Sie alle anderen unveränderlichen Clojure-Strukturen würden. Es hat eine ganze Reihe von "mutierenden" Funktionen: (api)

Sie alle geben einen ganzen "modifizierten" Reißverschluss zurück. Sie können dann an den Anfang des Reißverschlusses gehen und xml/emit ausgeben, um das XML zu drucken.