2010-05-07 4 views
8

Dites, je suis en train d'analyser un flux RSS et je veux en extraire un sous-ensemble d'informations.Façon idiomatique de construire une structure personnalisée à partir de la fermeture éclair XML dans Clojure

(def feed (-> "http://..." clojure.zip/xml-zip clojure.xml/parse)) 

Je peux obtenir des liens et des titres séparément:

(xml-> feed :channel :item :link text) 
(xml-> feed :channel :item :title text) 

Cependant, je ne peux pas comprendre la façon de les extraire en même temps sans traverser la fermeture plus d'une fois, par exemple

(let [feed (-> "http://..." clojure.zip/xml-zip clojure.xml/parse)] 
    (zipmap 
     (xml-> feed :channel :item :link text) 
     (xml-> feed :channel :item :title text))) 

... ou une variante de celui-ci, impliquant la cartographie des séquences multiples à une fonction qui construit de manière incrémentielle une carte avec, par exemple, assoc.

Non seulement je dois traverser la séquence plusieurs fois, mais les séquences ont aussi des états séparés, donc les éléments doivent être "alignés", pour ainsi dire. C'est-à-dire, dans un cas plus complexe que le RSS, un sous-élément peut manquer dans un élément particulier, en raccourcissant l'une des séquences de un (il n'y a pas d'espace). Le résultat peut donc être incorrect.

Existe-t-il un meilleur moyen ou est-ce, en fait, le comme vous le faites dans Clojure?

Répondre

3

Que pensez-vous de cela?

(reduce (fn [h item] 
      (assoc h (xml1-> item :title text) 
        (xml1-> item :link text))) 
     {} (xml-> feed :channel :item)) 
Questions connexes