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)) слюна назад xml, но дело не в этом.
Обновление: На самом деле, для отправки 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
if xml version = '1.0' encoding = 'UTF-8'?>
- это не то, что вам нужно.)
Вы можете использовать библиотеку xml-zip для «мутации» XML, как и вы бы сделали любую другую неизменяемую структуру Clojure. Он имеет полный набор «изменяющих» функций: (api)
Все они возвращают целую «модифицированную» застежку-молнию. Затем вы можете перейти к верхней части этой застежки-молнии и пользователю xml / emit распечатать XML.