Roundtripping xml в Clojure с помощью clojure.xml/parse и clojure.xml/emit

Ниже распространения в прямом и обратном направлениях производит недопустимый 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
6
задан mac 17 March 2010 в 14:41
поделиться

1 ответ

Я быстро проверил исходный код и 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=\"&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 ; структура представления XML в Clojure одинакова для обеих библиотек, но только последняя выполняет правильную передачу.

8
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: