xml - 在 Clojure 中从 XML zipper 构建自定义结构的惯用方法

标签 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)

但是我想不出在不多次遍历 zipper 的情况下同时提取它们的方法,例如

(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 中的方法?

最佳答案

这个呢?

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

关于xml - 在 Clojure 中从 XML zipper 构建自定义结构的惯用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2788095/

相关文章:

java - 如何根据第一个已知标记分支 SAX 解析器?

postgresql - 尝试为 Clojure/Korma/PostgreSQL 站点创建用户登录

clojure - ClojureScript 如何将其命名空间与 Clojure 命名空间区分开来?

testing - 返回值不是 (quote <value>)

android - 在xml中设置 map fragment 参数

javascript - Javascript 中带有前导零的数字

database - 函数式编程和业务领域模型

intellij-idea - IntelliJ Cursive 中的增大和缩小选择键绑定(bind)

java - 循环遍历所有节点并更新Java中的值

c# - 使用 openxml 删除 x 命名空间