Мутирование XML в Clojure

Clojures clojure.xml/parse, clojure.zip/xml-zip и clojure.contrib.zip-filter.xml/xml- > - отличные инструменты для вытягивания значений из xml, но что, если Я хочу изменить xml (результат clojure.zip/xml-zip) на основе того, что я узнал из xml- > "запросов", и записать результат в формате xml?

Я бы ожидал, что (clojure.contrib.prxml/prxml (clojure.xml/parse xml-content)) верните xml, но это не так.

Ответ 1

Обновление: На самом деле, для испускания XML лучше использовать clojure.contrib.lazy-xml/emit, потому что clojure.xml/emit в настоящее время может сломать вещи! См. Мой комментарий ниже.

(оставляя этот ответ здесь сейчас как предупреждение.)


Если я правильно понимаю, основная проблема вопроса связана с превращением (возможно, мутированного) представления XML в текст XML?

Если да, взгляните на clojure.xml/emit и 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 захватывает распечатанный вывод и завершает его как строку, по какой-то причине xml/emit печатает xml, поэтому он вам пригодится. Вы хотите использовать emit-element, если <?xml version='1.0' encoding='UTF-8'?> не является что вы хотите.)

Ответ 2

Вы можете использовать библиотеку xml-zip для "мутации" XML так же, как и любой другой из Clojure неизменяемых структур. Он имеет полный набор "мутирующих" функций: (api)

Все они возвращают целую "модифицированную" молнию. Затем вы можете перейти к вершине этой застежки-молнии и пользователю xml/emit для печати XML.