2010-05-07 60 views
8

說,我解析RSS提要,並希望從中提取一部分信息。從Clojure中的XML拉鍊建立自定義結構的習慣方式

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

我能得到的鏈接和標題分別:

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

但是我想不通的方式在同一時間提取它們沒有穿過拉鍊不止一次,例如

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

...或其變體中,涉及多個序列映射到該遞增地建立與,比如說,assoc地圖的功能。

不僅我必須遍歷序列多次,序列也有不同的狀態,所以元素必須「對齊」,可以這麼說。也就是說,在RSS比較複雜的情況下,子元素可能在特定元素中缺失,導致序列之一縮短一個(沒有空位)。所以結果可能實際上是不正確的。

有沒有更好的方法呢,或者說,它實際上是方式,你在Clojure中做到了嗎?

回答

3

這是怎麼回事?

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