laisse supposer que nous avons du XML comme ceci:retour plusieurs valeurs à l'aide zipper xml clojure
<a>
<b>
<c>text</c>
<d>
<e>text</e>
<f>
... lots of cruft here ..
</f>
</d>
</b>
<b>
...
</b>
<!-- more b sub-trees -->
</a>
Maintenant, en regardant à travers les échantillons dans zip_filter/xml.clj, j'ai compris comment se rendre à des valeurs uniques que je suis intéressé.
Je me demande comment je ferais quelque chose comme retourner une liste de paires de valeurs de texte de (ce).
EDIT:
Voici un code de travail, mais il est assez laid. Ne pas demander de refactoring trivial, mais y at-il une meilleure façon que les fermetures à glissière nous donnent pour faire cela?
(defn extract-data [xml]
(let [items (x/xml-> xml zf/descendants :Item) ;items not top-level
getAttributes #(x/xml1-> % :ItemAttributes) ;items have itemattributes
getASIN #(x/xml1-> % :ASIN x/text) ;items have ASINs
getTitle #(x/xml1-> % :Title x/text) ;itemattributes have Titles
getAuthor #(x/xml1-> % :Author x/text)] ;itemattributes have Authors
(map
;build a function to get everything we need from the items, and apply
#(let [attributes (getAttributes %)] ;get the attributes, we'll use it twice
(list
(getASIN %)
(getTitle attributes)
(getAuthor attributes)))
items)))
+1 pour m'avoir montré juxt et une façon plus simple de le faire. Je vais l'essayer bientôt. – z5h
Cool. Je peux aussi faire ceci pour éviter 2 appels à getAttributes. '(map (juxt getASIN (comp (juxt getTitle getAuthor) getAttributes)) items) mais je dois aplatir le vecteur. – z5h