(针对评论进行了更新:请参阅答案末尾以获取由要匹配的标签参数化的现成函数。)
下面从问题文本中的 URL 所指向的 XML 中提取标题(在 Clojure 1.5.1 REPL 中使用 clojure.data.xml 0.0.7 和 clojure.data.zip 0.1.1 进行测试):
(require '[clojure.zip :as zip]
         '[clojure.data.xml :as xml]
         '[clojure.data.zip.xml :as xz]
         '[clojure.java.io :as io])
(def data-url "http://api.eventful.com/rest/events/search?app_key=4H4Vff4PdrTGp3vV&keywords=music&location=Belgrade&date=Future")
(def data (-> data-url io/reader xml/parse))
(def z (zip/xml-zip data))
(mapcat (comp :content zip/node)
        (xz/xml-> z
                  (xz/tag= :events)
                  (xz/tag= :event)
                  (xz/tag= :title)))
;; value of the above right now:
("Belgrade Early Music Festival, Gosta / Purcell: Dido & Aeneas"
 "Belgrade Early Music Festival, Gosta / Purcell: Dido & Aeneas"
 "Belgrade Early Music Festival, Gosta / Purcell: Dido & Aeneas"
 "VIII Early Music Festival, Belgrade 2013"
 "Kevlar Bikini"
 "U-Recken - Tree of Life Pre event"
 "Green Day"
 "Smallman - Vrane Kamene (Crows Of Stone)"
 "One Direction"
 "One Direction in Serbia")
一些评论:
- clojure.contrib.*命名空间都已弃用。- xml->现在住在- clojure.data.zip.xml.
 
- xml->接受一个 zip loc 和一堆“谓词”;然而,在这种情况下,“谓词”一词具有不寻常的含义,即对 zip locs 起作用的过滤功能。查看- clojure.data.zip.xml返回此类谓词的几个函数的源代码;有关使用示例,请参见上文。
 
- 如果要单独定义谓词列表,也可以这样做,然后使用- xml->with- apply:
 - (def loc-preds [(xz/tag= :events) (xz/tag= :event) (xz/tag= :title)])
(mapcat (comp :content zip/node) (apply xz/xml-> z loc-preds))
;; value returned as above
 
更新:这是一个函数,它将 url 和关键字命名标签作为参数并返回在标签中找到的内容:
(defn get-content-from-tags [url & tags]
  (mapcat (comp :content zip/node)
          (apply xz/xml->
                 (-> url io/reader xml/parse zip/xml-zip)
                 (for [t tags]
                   (xz/tag= t)))))
像这样称呼它:
(get-content-from-tags data-url :events :event :title)
mapcat给出与上述表格相同的结果。