Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在CLojure中,如何使用任意pred调用xml->_Clojure_Xml Parsing - Fatal编程技术网

在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!我昨晚看到宏无法工作,这是一个极好的解决方案。