在CLojure中,如何使用任意pred调用xml->
我想创建一个函数,允许我从一些提要中提取内容,以下是我所拥有的。。。采埃孚是从这里来的在CLojure中,如何使用任意pred调用xml->,clojure,xml-parsing,Clojure,Xml Parsing,我想创建一个函数,允许我从一些提要中提取内容,以下是我所拥有的。。。采埃孚是从这里来的 (:require [clojure.zip :as z] [clojure.data.zip.xml :only (attr text xml->)] [clojure.xml :as xml ] [clojure.contrib.zip-filter.xml :as zf] ) (def data-u
(:require
[clojure.zip :as z]
[clojure.data.zip.xml :only (attr text xml->)]
[clojure.xml :as xml ]
[clojure.contrib.zip-filter.xml :as zf]
)
(def data-url "http://api.eventful.com/rest/events/search?app_key=4H4Vff4PdrTGp3vV&keywords=music&location=Belgrade&date=Future")
(defn zipp [data] (z/xml-zip data))
(defn contents[cont & tags]
(assert (= (zf/xml-> (zipp(parsing cont)) (seq tags) text))))
但是当我叫它
(contents data-url :events :event :title)
我犯了一个错误
java.lang.RuntimeException:java.lang.ClassCastException:clojure.lang.ArraySeq不能强制转换为clojure.lang.IFn无源文件:0更新以响应注释:请参阅答案结尾,以获取由要匹配的标记参数化的现成函数
以下内容从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和一组谓词;然而,在这种情况下,单词predicate有一个不寻常的含义,即处理zip loc的过滤函数。请参阅clojure.data.zip.xml源代码,了解返回此类谓词的几个函数;有关使用示例,请参见上文
如果要单独定义谓词列表,也可以这样做,然后使用xml->with apply:
更新:这里有一个函数,它将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表单相同的结果。根据注释进行更新:请参阅答案末尾,了解由要匹配的标记参数化的现成函数
以下内容从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和一组谓词;然而,在这种情况下,单词predicate有一个不寻常的含义,即处理zip loc的过滤函数。请参阅clojure.data.zip.xml源代码,了解返回此类谓词的几个函数;有关使用示例,请参见上文
如果要单独定义谓词列表,也可以这样做,然后使用xml->with apply:
更新:这里有一个函数,它将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表单相同的结果。您确定这是正确的代码吗?有很多事情是没有意义的,比如断言表单用法,什么是zip,什么是文本etcI忘记从我的代码中添加zip函数,断言来自clojure/core-计算expr,如果它的计算结果不符合逻辑true,则抛出异常。哦,文本来自clojure contribs zip filter[链接]您的=表单只有一个值zf/xml->zippparsing cont seq tags text,没有其他值可以比较,以确定这是正确的代码吗?有很多事情是没有意义的,比如断言表单用法,什么是zip,什么是文本etcI忘记从我的代码中添加zip函数,断言来自clojure/core-计算expr,如果它的计算结果不符合逻辑true,则抛出异常。哦,文本来自clojure contribs zip filter[链接]您的=表单只有一个值zf/xml->zippparsing cont seq tags text,没有其他值可以与感谢您的回答相比,我还尝试了另一件事,创建pred,如[k keys]['xz/tag'=k]的defn pred[&keys]列表。但是当我在我用你的答案创建的fn中使用它时,defn从标记[url&tags]mapcat comp:content-zip/node-xz/xml->zipp-parsing-url-apply preds标记列表中获取内容。我得到这个错误java.lang.RuntimeException:java.lang.ClassCastException:clojure.lang.LazySeq不能转换为clojure.lang.IFn没有源文件:0,你知道我做错了什么吗?你需要将xml->函数应用到你的谓词列表:apply xz/xml->。。。应用pred列表。。。。您可能想考虑PREDS列表采用单个集合参数而不是VARARGS,并丢弃第二个应用程序;哪个版本更好取决于如何使用其他pred列表。而且,['xz/tag'=k]是一个包含两个符号和k值的向量。要创建tag=谓词,需要调用tag=函数:xz/tag=k。注意。等号是名称标记的一部分=;你不能在它和标记之间插入空格。是的……我知道了,我现在修复了这个问题,但是当我从标记调用get contents时,我得到了一个空列表,因为pred的列表不能正常工作,也许我可以将它设为宏……这里不需要宏,而且无论如何,它需要发出与你为一个工作函数编写的代码基本相同的代码。我已经编辑了答案以包含一个工作函数。谢谢Michal!昨晚我看到宏不起作用,这是一个极好的解决方案。谢谢Michal的回答,我还尝试了一件事,创建pred,就像这个defn li
[k个键]['xz/tag'=k]的preds[&key]的st。但是当我在我用你的答案创建的fn中使用它时,defn从标记[url&tags]mapcat comp:content-zip/node-xz/xml->zipp-parsing-url-apply preds标记列表中获取内容。我得到这个错误java.lang.RuntimeException:java.lang.ClassCastException:clojure.lang.LazySeq不能转换为clojure.lang.IFn没有源文件:0,你知道我做错了什么吗?你需要将xml->函数应用到你的谓词列表:apply xz/xml->。。。应用pred列表。。。。您可能想考虑PREDS列表采用单个集合参数而不是VARARGS,并丢弃第二个应用程序;哪个版本更好取决于如何使用其他pred列表。而且,['xz/tag'=k]是一个包含两个符号和k值的向量。要创建tag=谓词,需要调用tag=函数:xz/tag=k。注意。等号是名称标记的一部分=;你不能在它和标记之间插入空格。是的……我知道了,我现在修复了这个问题,但是当我从标记调用get contents时,我得到了一个空列表,因为pred的列表不能正常工作,也许我可以将它设为宏……这里不需要宏,而且无论如何,它需要发出与你为一个工作函数编写的代码基本相同的代码。我已经编辑了答案以包含一个工作函数。谢谢Michal!我昨晚看到宏无法工作,这是一个极好的解决方案。