xml - 在 Clojure 中如何在集合上应用函数

标签 xml clojure zipper

我正在尝试应用函数从一组标签的 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

我建议你稍微清理一下你的代码,因为它似乎有很多问题:

  1. clojure.data.zip.xml 的双重要求.
  2. 函数定义中的额外括号xz .
  3. xz用作命名空间的别名和函数的名称。
  4. 删除括号 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/

相关文章:

c# - 在 Xamarin.Android 中找不到与给定名称(在 'headerLayout' 处)匹配的资源

browser - 使用 Shadow-cljs 观看应用程序时,我应该何时刷新浏览器以查看更改?硬刷新和重建怎么样?

clojure - 如何评估 Clojure 中的纯函数序列

scala - 用 Zipper 解决 Twitter Puddle

recursion - 由于 zipper 和 HOF,递归是一种气味(在惯用的 Clojure 中)吗?

java - 如何告诉 JAXB 在运行时序列化哪些字段?

java - 将 GAE 项目迁移到 Java 8 - 将运行时属性添加到 appengine-web.xml 后出现 XML 验证错误

xml - 使用 clojure xml zipper 返回多个值

java - 集成多个 Swagger2Feature 实例

clojure - 使用 Clojure 向量对 7 张牌扑克牌进行建模