Ниже распространения в прямом и обратном направлениях производит недопустимый xml, поскольку результата не оставляют правильно, т.е. значения атрибута содержат 'вместо apos;. я делаю что-то неправильно, или действительно ли это - ошибка?
(ns xml-test
(:require [clojure.xml :as xml])
(:require [clojure.zip :as zip]))
(def test-xml "<?xml version="1.0" encoding="UTF-8"?> <main> <item attr=''test''> </item> </main>")
(def s (ByteArrayInputStream. (.getBytes test-xml "UTF-8")))
(xml/emit (zip/root (zip/xml-zip (clojure.xml/parse s))))
output:
<?xml version='1.0' encoding='UTF-8'?>
<main>
<item attr=''test''/>
</main>
nil
Я быстро проверил исходный код и clojure.xml / emit-element
(который вызывается из clojure.xml / emit
) не прилагает никаких усилий для кодирования любых символов как XML-сущностей; фактически, он позволяет значениям атрибутов напрямую. Я полагаю, это означает, что использование clojure.xml
весьма ограничено; вместо этого вам следует использовать clojure.contrib.lazy-xml
. Приношу свои извинения за то, что не упомянул об этом в ответе на ваш первый вопрос об отправке XML, я не понимал, что такое может произойти.
С помощью clojure.contrib.lazy-xml
вы можете сделать следующее:
user> (lazy-xml/emit
(lazy-xml/parse-trim
(java.io.StringReader. "<foo bar=\"'""'\"/>")))
<?xml version="1.0" encoding="UTF-8"?><foo bar="'""'"/>
Если вы действительно хотите использовать clojure.xml
, вам придется передать clojure.xml / emit
и используйте вместо этого производителя XML по вашему выбору. На самом деле, вы можете использовать clojure.xml / parse
, изменить результат и передать его в clojure.contrib.lazy-xml / emit
; структура представления XML в Clojure одинакова для обеих библиотек, но только последняя выполняет правильную передачу.