在Clojure中从XML拉链构建自定义结构的惯用方法

时间:2010-05-07 11:20:53

标签: xml clojure

说,我正在解析RSS提要,并希望从中提取一部分信息。

(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中做到了吗?

1 个答案:

答案 0 :(得分:3)

这个怎么样?

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