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

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

10 голосов
/ 16 марта 2010

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, но это не так.

Ответы [ 2 ]

7 голосов
/ 16 марта 2010

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

Все они возвращают целую «модифицированную» молнию. Затем вы можете перейти на верхнюю часть этой молнии, и пользователь xml / emit напечатает XML.

5 голосов
/ 16 марта 2010

Обновление: На самом деле, для передачи 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'?> что хочешь.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...