2013-07-07 51 views
3

我想應用函數從標籤集合上的xml提取一個標籤的內容。基本上,我試圖做一個函數,將提取XML內容,這樣在Clojure如何應用功能的集合

(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) 

我得到一個空集合()。

回答

3

def進不去tags你實際上並沒有建立一個文字列表但:venue_name作爲參數來:title通話。嘗試宣告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可以是單個關鍵字或一系列關鍵字,在這種情況下,調用xml1->時會使用apply

(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) 
+0

感謝胡安,但現在我得到java.lang.IllegalArgumentException異常:數字參數的個數錯誤(0)傳遞到:數據模型$ FUNC $ FN :( – Vesna

+0

@Vesna我的問題列表添加的項目4,這是我 –

+0

我改變了它,仍然沒有運氣,我想知道是否有可能創建函數列表 – Vesna