Clojure: использование застежек-молний для извлечения значения из xml

Я долго ломал голову над этим, наверное это что-то банальное (или нет). Вот он - я хочу вытащить некоторые значения из xml. Вот моя программа (она должна быть переработана, это рабочая версия)

    (ns datamodel
    (:import (java.io ByteArrayInputStream))
    (:use 
    [net.cgrand.enlive-html :as en-html ])
    (: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")

 (defstruct event :event-name :performers :start-time :stop-time)

(defn get-events [xz] 
(map (juxt #(zf/xml1-> % (:title text)) 
    #(zf/xml1-> % (:performers :performer :name text)) 
    #(zf/xml1-> % (:start_time text)) 
     #(zf/xml1-> % (:stop_time text)))
 (zf/xml-> xz  :events :event)))

 (defn create-map-of-events []
(map #(apply struct event %) (get-events (z/xml-zip (xml/parse "http://api.eventful.com/rest/events/search? app_key=4H4Vff4PdrTGp3vV&keywords=music&location=Belgrade&date=Future")))))

в REPL (создание карты событий) дает мне java.lang.RuntimeException: java.lang.NullPointerException

Что я делаю не так с xml1->?


person Vesna    schedule 08.01.2013    source источник


Ответы (1)


Проблема была здесь

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

Я поместил :title zf/text в круглые скобки, и это было ошибкой. Теперь это работает просто отлично.

person Vesna    schedule 08.01.2013