无法在Clojure中创建xml字符串

时间:2012-02-23 03:22:16

标签: xml clojure

我是一个尝试创建一些XML字符串的Clojure n00b。

我的目标是创造这样的东西:

<?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元素对象的集合,并将其作为':items'元素定义的:content参数。

这两个表单正确计算,但是在调用元素调用的结果时,emit-str失败。

所以我的问题是:如何将'collection-of-items'var作为参数传递给元素函数,以便它显示为一个简单的变量参数列表?还是我完全错过了Clojure船?

全部谢谢!

1 个答案:

答案 0 :(得分:4)

使用apply

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>"