Раскрутка xml в Clojure с использованием clojure.xml / parse и clojure.xml / emit - PullRequest
6 голосов
/ 17 марта 2010

Ниже 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 Ответ

8 голосов
/ 17 марта 2010

Я быстро проверил источник, и 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 одинакова для обеих библиотек, но только последняя выполняет правильное излучение.

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