2012-02-23 6 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引数として指定します。

これらの2つの形式は正しく評価されますが、要素呼び出しの結果に対してemit-strが呼び出されると失敗します。

私の質問は、単純な可変引数リストとして表示されるように、 'collection-of-items' varを引数として要素関数に渡すにはどうすればいいですか?または私はClojureボートを完全にここに逃していますか?

ありがとうございます!

答えて

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

Oustanding!どうもありがとう。 – ScottR

+0

確かに、助けてうれしい! –

関連する問題