में एक्सएमएल फाइलों पर जिपर पेड़ में सम्मिलन मैं उलझन में हूं कि clojure.contrib के zip-filter.xml के माध्यम से प्राप्त XML एक्स पेड़ को निष्क्रिय रूप से कैसे बदला जाए। ऐसा करने की कोशिश करनी चाहिए, या क्या कोई बेहतर तरीका है?क्लोजर
कहो मैं कुछ डमी xml फ़ाइल को "itemdb.xml" इस तरह है:
<itemlist>
<item id="1">
<name>John</name>
<desc>Works near here.</desc>
</item>
<item id="2">
<name>Sally</name>
<desc>Owner of pet store.</desc>
</item>
</itemlist>
और मैं कुछ कोड है:
(require '[clojure.zip :as zip]
'[clojure.contrib.duck-streams :as ds]
'[clojure.contrib.lazy-xml :as lxml]
'[clojure.contrib.zip-filter.xml :as zf])
(def db (ref (zip/xml-zip (lxml/parse-trim (java.io.File. "itemdb.xml")))))
;; Test that we can traverse and parse.
(doall (map #(print (format "%10s: %s\n"
(apply str (zf/xml-> % :name zf/text))
(apply str (zf/xml-> % :desc zf/text))))
(zf/xml-> @db :item)))
;; I assume something like this is needed to make the xml tags
(defn create-item [name desc]
{:tag :item
:attrs {:id "3"}
:contents
(list {:tag :name :attrs {} :contents (list name)}
{:tag :desc :attrs {} :contents (list desc)})})
(def fred-item (create-item "Fred" "Green-haired astrophysicist."))
;; This disturbs the structure somehow
(defn append-item [xmldb item]
(zip/insert-right (-> xmldb zip/down zip/rightmost) item))
;; I want to do something more like this
(defn append-item2 [xmldb item]
(zip/insert-right (zip/rightmost (zf/xml-> xmldb :item)) item))
(dosync (alter db append-item2 fred-item))
;; Save this simple xml file with some added stuff.
(ds/spit "appended-itemdb.xml"
(with-out-str (lxml/emit (zip/root @db) :pad true)))
मैं कैसे clojure का उपयोग करने के बारे में स्पष्ट नहीं कर रहा हूँ। ज़िप इस मामले में उचित रूप से कार्य करता है, और यह ज़िप-फ़िल्टर के साथ कैसे इंटरैक्ट करता है।
यदि आप इस छोटे से उदाहरण में विशेष रूप से अजीब कुछ भी खोजते हैं, तो कृपया इसे इंगित करें।
contrib.zip फिल्टर:
ज़िप फिल्टर के लिए एक वैकल्पिक (। मैं एक अधिक व्यापक जवाब बनाने के लिए जा रहा था लेकिन मीकल पहले से ही के रूप में एक बहुत अच्छा एक लिखित) लू ए है .xml अब https://github.com/clojure/data.zip/ – claj