3

タグのコレクションの xml から 1 つのタグのコンテンツを抽出する関数を適用しようとしています。基本的に、このように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)

空のコレクション () を取得します。

4

1 に答える 1

3

definingの場合tags、実際にはリテラル リストを構築するのではなく、引数として:titlewithを呼び出します。次の方法でリストまたはベクターとして:venue_name宣言してみてください。tags

(def tags '(:title :venue_name)) ;list
(def tags [:title :venue_name]) ; vector

コードには多くの問題があるように思われるため、コードを少しクリーンアップすることをお勧めします。

  1. の 2 倍の要件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)
于 2013-07-07T20:32:08.537 に答える