Проблемы с созданием XML-строк в Clojure - PullRequest
1 голос
/ 23 февраля 2012

Я - Clojure n00b, пытаюсь создать несколько строк XML.

Моя цель - создать что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<items>
  <item name="n0">n0 value</item>
  <item name="n1">n1 value</item>
  <item name="n2">n2 value</item>
</items>

Я могу использовать функцию элемента библиотеки clojure.data.xml прямо так:

(element :items {} 
  (element :item {:name "n0"} "n0 value")
  (element :item {:name "n1"} "n1 value")
  (element :item {:name "n2"} "n2 value"))

, и это отвечает на emit-str, как и ожидалось, и печатает xml, который я ищу.

Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть переменное количество предметов для данной коллекции предметов, поэтому я хочу сделать что-то похожее на это:

(def collection-of-items 
    [(element :item {:name "n0"} "n0 value") 
     (element :item {:name "n1"} "n1 value")])

(element :items {} 
  collection-of-items)

Т.е. я создаю коллекцию из нескольких объектов-элементов xml и задаю это в качестве аргумента: content для определения элемента ': items'.

Эти две формы вычисляются правильно, но тогда emit-str завершается ошибкой, когда вызывается в результате вызова элемента.

Итак, мой вопрос: как передать var «collection-items» в функцию element в качестве аргумента, чтобы он отображался как простой список аргументов переменной? Или я полностью скучаю по лодке Clojure?

Спасибо всем!

1 Ответ

4 голосов
/ 23 февраля 2012

Использовать применять :

user=> (def collection-of-items 
    [(element :item {:name "n0"} "n0 value") 
     (element :item {:name "n1"} "n1 value")])
#'user/collection-of-items
user=> (def b (apply element :items {} collection-of-items))
#'user/b
user=> b
#clojure.data.xml.Element{:tag :items, :attrs {}, :content (#clojure.data.xml.Element{:tag :item, :attrs {:name "n0"}, :content ("n0 value")} #clojure.data.xml.Element{:tag :item, :attrs {:name "n1"}, :content ("n1 value")})}
user=> (emit-str b)
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><items><item name=\"n0\">n0 value</item><item name=\"n1\">n1 value</item></items>"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...