我一直在敲打这个,这可能是平庸的(或不是)。这里是 - 我想从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中的(create-map-of-events)给了我一个java.lang.RuntimeException:java.lang.NullPointerException
xml1->我做错了什么?
答案 0 :(得分:2)
问题出在这里
(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)))
我把:zf / text标题放在括号中,这是一个错误。现在它工作得很好。