2010-05-07 10 views
8

में एक्सएमएल जिपर से कस्टम संरचना बनाने का बेवकूफ तरीका कहें, मैं एक आरएसएस फ़ीड पार्स कर रहा हूं और इससे जानकारी का सबसेट निकालना चाहता हूं।क्लोजर

(def feed (-> "http://..." clojure.zip/xml-zip clojure.xml/parse)) 

मैं अलग से लिंक और खिताब प्राप्त कर सकते हैं:

(xml-> feed :channel :item :link text) 
(xml-> feed :channel :item :title text) 

हालांकि मैं ज़िपर एक बार से अधिक है, उदा traversing बिना उन्हें एक ही समय में निकालने के लिए जिस तरह से समझ नहीं

(let [feed (-> "http://..." clojure.zip/xml-zip clojure.xml/parse)] 
    (zipmap 
     (xml-> feed :channel :item :link text) 
     (xml-> feed :channel :item :title text))) 

... या उसके किसी विविधता, एक समारोह है कि संवर्द्धित साथ, कहते हैं, assoc एक नक्शा बनाता करने के लिए कई दृश्यों मानचित्रण शामिल हैं।

न केवल मुझे अनुक्रम को कई बार पार करना होगा, अनुक्रमों में अलग-अलग राज्य भी हैं, इसलिए तत्वों को "गठबंधन" होना चाहिए, ताकि बोल सकें। यही है, आरएसएस की तुलना में एक अधिक जटिल मामले में, एक विशेष तत्व में एक उप-तत्व गायब हो सकता है, जिससे अनुक्रमों में से एक को कम से कम एक (कोई अंतर नहीं है) बनाते हैं। तो परिणाम वास्तव में गलत हो सकता है।

क्या कोई बेहतर तरीका है या वास्तव में जिस तरह से आप क्लोजर में करते हैं?

उत्तर

3

इसके बारे में क्या?

(reduce (fn [h item] 
      (assoc h (xml1-> item :title text) 
        (xml1-> item :link text))) 
     {} (xml-> feed :channel :item))