我正在尝试应用函数从一组标签的 xml 中提取一个标签的内容。基本上,我正在尝试制作一个从 xml 中提取内容的函数,就像这样
(defn get-events
[xz]
(map (juxt
#(zf/xml1-> % :title zf/text)
#(zf/xml1-> % :performers :performer :name zf/text)
#(zf/xml1-> % :start_time zf/text)
#(zf/xml1-> % :stop_time zf/text))
(zf/xml-> xz :events :event)))
到目前为止我的解决方案是这样的
(ns datamodel
(:use
[net.cgrand.enlive-html :as en-html ])
(:require
[clojure.zip :as z]
[clojure.xml :as xml ]
[clojure.data.zip.xml :as zf]
[clojure.java.io :as io]
))
(def data-url "http://api.eventful.com/rest/events/search? app_key=4H4Vff4PdrTGp3vV&keywords=music&location=Belgrade&date=Future")
(defn xz [url](z/xml-zip (xml/parse url)))
(defn xml-zipper [& tags](zf/xml-> (xz data-url) tags))
(defn func [& tags]#(zf/xml1-> (xml-zipper tags) % zf/text))
(def tags [:title :venue_name])
在 REPL 中,当我尝试将 func 应用于这样的标签时
(map #((apply comp (reverse( func :events :event))) %) tags)
我得到一个空集合 ()。
最佳答案
当 def
宁宁tags
您实际上并不是在构建文字列表,而是在调用 :title
与 :venue_name
作为它的论据。尝试声明 tags
以下列方式作为列表或向量:
(def tags '(:title :venue_name)) ;list
(def tags [:title :venue_name]) ; vector
我建议你稍微清理一下你的代码,因为它似乎有很多问题:
clojure.data.zip.xml
的双重要求.- 函数定义中的额外括号
xz
. -
xz
用作命名空间的别名和函数的名称。 - 删除括号
func
匿名函数(#(zf/xml1-> (xml-zipper tags) % zf/text))
,您正在创建并调用它fn
同时。
希望对您有所帮助。
编辑
我想我现在明白你想做什么了。这是选择器生成器函数的工作版本:selector
.请注意参数 tag
可以是单个关键字或关键字序列,在这种情况下 apply
在调用 xml1->
时使用.
(ns datamodel
(:require [clojure.zip :as z]
[clojure.xml :as xml]
[clojure.data.zip.xml :as zf]
[clojure.java.io :as io]))
(def data-url "http://api.eventful.com/rest/events/search?app_key=4H4Vff4PdrTGp3vV&keywords=music&location=Belgrade&date=Future")
(defn parse [url]
(z/xml-zip (xml/parse url)))
(defn selector [tag]
(if (sequential? tag)
#(apply zf/xml1-> % (concat tag [zf/text]))
#(zf/xml1-> % tag zf/text)))
(defn get-events
[xml & tags]
(let [events (zf/xml-> xml :events :event)
fs (map selector tags)]
(map (apply juxt fs) events)))
(-> data-url
parse
(get-events :title :start_time [:performers :performer :name] :stop_time)
first
prn)
关于xml - 在 Clojure 中如何在集合上应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17515985/