Clojure中使用XML zipper构建自定义结构的惯用方式

8

假如我正在解析一个 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个回答

3

这个怎么样?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接