Created
February 3, 2017 11:54
-
-
Save tfrisk-old/11d0c3f91f0a1ba827ecae8a378d7661 to your computer and use it in GitHub Desktop.
Finnkinon API-rajapinnan käsittelyä Clojurella
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; Clojure-harjoituskoodi Finnkinon XML-rajapinnan lukemiseen. | |
; Tarkoitettu alunperin ClojureBridgeen osallistuneille oppilaille | |
; ohjelmoinnin jatkoharjoittelua varten. | |
(ns finnkino-api-lukija.core | |
(:require [clojure.xml :as xml]) | |
(:gen-class)) | |
; Käytettävän rajapinnan osoitteet | |
(def teatterit-api "http://www.finnkino.fi/xml/TheatreAreas/") | |
(def näytökset-api "http://www.finnkino.fi/xml/Schedule/") | |
; Apufunktio xml-parsintaan | |
(defn lue-raaka-xml [osoite] | |
(get (xml/parse osoite) :content)) | |
; ############################################################## | |
; Lue teatterien tunnus/tekstitieto raaka-xml:stä | |
; XML on hieman työläs tiedostomuoto | |
; | |
; <TheatreArea><ID>1014</ID><Name>Pääkaupunkiseutu</Name></TheatreArea> | |
; | |
(defn lue-teatteri-tieto [teatteri] | |
(hash-map | |
:tunnus | |
(first (get (first (get teatteri :content)) :content)) | |
:teatteri | |
(first (get (second (get teatteri :content)) :content)))) | |
(def teatterit | |
(map lue-teatteri-tieto (lue-raaka-xml teatterit-api))) | |
(defn hae-teatteri [tunnus] | |
(filter | |
#(= (:tunnus %) tunnus) | |
teatterit)) | |
(hae-teatteri "1019") | |
; ############################################################## | |
; Leffanäytökset | |
; Apufunktio xml:n datan parsintaan, helpottaa tietojen lukua lue-näytös-tieto funktiossa | |
(defn hae-elementti [data paikka] | |
(first (get (nth (get data :content) paikka) :content))) | |
; Luo genreistä Clojuren set-tietotyyppi, josta on myöhemmin helppo etsiä genrejä | |
; Alkuperäinen teksti pilkotaan pilkkujen kohdalta ja sen jälkeen trimmataan | |
; (poistetaan välilyönnit lopusta ja alusta) | |
(defn pilko-genret [teksti] | |
(set (map clojure.string/trim ; poista turhat välilyönnit | |
(clojure.string/split teksti #",")))) ; pilko ensin pilkkujen kohdalta | |
; Käsittele yksittäinen näytöstieto ja poimi vain tarvittavat xml-kentät | |
(defn lue-näytös-tieto [näytös] | |
(hash-map | |
:tunnus | |
(first (get (first (get näytös :content)) :content)) | |
:pituus | |
(Integer/parseInt (hae-elementti näytös 18)) | |
:nimi | |
(first (get (nth (get näytös :content) 15) :content)) | |
:ikäraja | |
(hae-elementti näytös 20) | |
:teatteri | |
(hae-elementti näytös 27) | |
:genret | |
(pilko-genret (hae-elementti näytös 24)))) | |
; Luetaan näytöstiedot yhteen "näytökset" muuttujaan | |
(def näytökset | |
(map lue-näytös-tieto (:content (second (lue-raaka-xml näytökset-api))))) | |
; Näytöksistä voidaan nyt suodattaa halutuilla hakutekijöillä | |
(filter | |
#(contains? (:genret %) "Perhe-elokuva") ; onko genret-setissä haluttu genre? | |
näytökset) | |
(filter | |
#(= (:teatteri %) "Flamingo, Vantaa") | |
näytökset) | |
; Suodatuksia voidaan myös yhdistää and-komennolla | |
(filter | |
#(and | |
(contains? (:genret %) "Perhe-elokuva") | |
(= (:teatteri %) "Tennispalatsi, Helsinki") | |
(< (:pituus %) 80)) ; pituus vähemmän kuin 80 minuuttia | |
näytökset) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment