Округление xml в Clojure с помощью clojure.xml / parse и clojure.в XML/излучать

ниже roundtrip создает invaild 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='&apos;test&apos;'> </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

1 ответов


я быстро проверил источник и clojure.xml/emit-element (который вызывается clojure.xml/emit) не делает никаких усилий для кодирования любых символов как XML-сущностей; на самом деле, он позволяет значения атрибутов прямо через. Я думаю, это означает clojure.xml довольно ограничен в своей практичности; вы должны использовать . Мои извинения за то, что не упомянул об этом в ответе на ваш первый вопрос о XML-излучении, я не знал, что такое произойдет.

С clojure.contrib.lazy-xml, вы можете сделать следующий:

user> (lazy-xml/emit
       (lazy-xml/parse-trim
        (java.io.StringReader. "<foo bar=\"&apos;&quot;&quot;&apos;\"/>")))
<?xml version="1.0" encoding="UTF-8"?><foo bar="'&quot;&quot;'"/>

если вы действительно хотели использовать clojure.xml, вам придется пройти на clojure.xml/emit и вместо этого используйте XML-производитель по вашему выбору. Ну, на самом деле, вы можете использовать clojure.xml/parse, искалечить результат, а затем передать его clojure.contrib.lazy-xml/emit; структура представления Clojure XML одинакова с обеими библиотеками, но только последняя выполняет правильное излучение.