2012-02-23 44 views
1

我是一個試圖創建一些XML字符串的Clojure n00b。在Clojure中創建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")) 

,這回應發出-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 Boat?

謝謝大家!

回答

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

奧斯坦丁!非常感謝。 – ScottR 2012-02-23 08:10:50

+0

當然,很高興幫助! – 2012-02-24 00:06:43

相關問題