2010-03-15 15 views
10

Clojures clojure.xml/parse, clojure.zip/xml-zip i clojure.contrib.zip-filter.xml/xml-> to doskonałe narzędzia do wyciągania wartości z xml, ale co jeśli chcę zmienić xml (wynik clojure.zip/xml-zip) na podstawie tego, czego uczę się z xml-> "queries" i zapisać wynik jako xml?Mutowanie XML w Clojure

Spodziewałbym się, że (clojure.contrib.prxml/prxml (clojure.xml/pars xml-content)) spit back xml, ale tak nie jest.

Odpowiedz

5

Aktualizacja: Właściwie emitujące XML, to najlepiej użyć clojure.contrib.lazy-xml/emit, ponieważ clojure.xml/emit jest obecnie prawdopodobnie złamać rzeczy! Zobacz mój komentarz poniżej.

(Pozostawiając tę ​​odpowiedź tutaj teraz jako ostrzeżenie.)


Jeśli dobrze rozumiem, główny nacisk w rachubę ma do czynienia z włączeniem (ewentualnie zmutowany) reprezentacja XML z powrotem do Tekst XML?

Jeśli tak, rzucić okiem na clojure.xml/emit i 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 przechwytuje wydruki i owija go jako ciąg znaków, z jakiegoś powodu xml/emit wydruki XML, więc przydaje się tutaj. Będziesz chciał użyć emit-element, jeśli <?xml version='1.0' encoding='UTF-8'?> nie jest tym, czego potrzebujesz.)

+1

Dla dobra przyszłych czytelników: Wydaje się, że jest to bardzo ograniczone pod względem użyteczności, ponieważ 'clojure.xml/emit' obecnie ma bardzo naiwne podejście do swojej pracy i np. zaniedbuje kodowanie rzeczy jako elementów XML ... Zamiast tego użyj 'clojure.contrib.lazy-xml/emit'. Zobacz także moją odpowiedź na kolejne pytanie: http://stackoverflow.com/questions/2463129/roundtripping-xml-in-clojure-using-clojure-xml-parse-and-clojure-xml-emit/2463768#2463768 –

+0

lazy-xml jest teraz https://github.com/clojure/data.xml/ – sventechie

7

Możesz użyć biblioteki xml-zip, aby "zmutować" XML, tak jak każdą inną z niezmiennych struktur Clojure. Ma pełny zestaw funkcji "mutowania": (api)

Wszystkie zwracają cały "zmodyfikowany" zamek błyskawiczny. Następnie możesz przejść na górę tego suwaka, a użytkownik xml/emituje, aby wydrukować plik XML.