Skip to content

Instantly share code, notes, and snippets.

@danlentz
Forked from stuartsierra/gist:1188879
Created February 18, 2014 07:26
Show Gist options
  • Save danlentz/9066119 to your computer and use it in GitHub Desktop.
Save danlentz/9066119 to your computer and use it in GitHub Desktop.
;;; XML parsing and clojure.zip
;;; There's got to be a cleaner way to do this.
;;; I have code like this:
(defn jdks-loc [xml-zipper]
(zip/down
(first
(filter #(let [n (zip/node %)]
(and (map? n) (= :jdks (:tag n))))
(iterate zip/right (zip/down xml-zipper))))))
(defn jdk-details [jdk-loc]
(reduce (fn [m elt]
(if (#{:name :home} (:tag elt))
(assoc m (:tag elt) (apply str (:content elt)))
m))
{}
(zip/children jdk-loc)))
(defn jdks [loc]
(map jdk-details (take-while identity (iterate zip/right loc))))
(defn do-it []
(jdks (jdks-loc (zip/xml-zip (ci-config-xml)))))
;;; To get a result like this:
user=> (do-it)
({:home "/usr/java/jdk1.6.0_20", :name "Sun JDK 1.6.0_20"}
{:home "/var/lib/hudson/tools/Sun_JDK_1.5.0_22", :name "Sun JDK 1.5.0_22"}
{:home "/usr/java/ibm-java2-x86_64-50", :name "IBM Java SDK 5.0-12.3"}
{:home "/usr/java/java-1.6.0-openjdk-1.6.0.0.x86_64", :name "OpenJDK 1.6.0.0-1.16.b17.el5"}
{:home "/usr/java/jrockit-jdk1.5.0_28-R28.1.3-4.0.1", :name "JRockit JDK 1.5.0_28-R28.1.3-4.0.1"}
{:home "/usr/java/jrockit-jdk1.6.0_24-R28.1.3-4.0.1", :name "JRockit JDK 1.6.0_24-R28.1.3-4.0.1"})
;;; From XML like this:
;; <?xml version='1.0' encoding='UTF-8'?>
;; <hudson>
;; <version>1.386</version>
;; <!-- ... bunch more tags ... -->
;; <jdks>
;; <jdk>
;; <name>Sun JDK 1.6.0_20</name>
;; <home>/usr/java/jdk1.6.0_20</home>
;; <properties/>
;; </jdk>
;; <jdk>
;; <name>Sun JDK 1.5.0_22</name>
;; <home>/var/lib/hudson/tools/Sun_JDK_1.5.0_22</home>
;; <properties/>
;; </jdk>
;; <jdk>
;; <name>IBM Java SDK 5.0-12.3</name>
;; <home>/usr/java/ibm-java2-x86_64-50</home>
;; <properties/>
;; </jdk>
;; <jdk>
;; <name>OpenJDK 1.6.0.0-1.16.b17.el5</name>
;; <home>/usr/java/java-1.6.0-openjdk-1.6.0.0.x86_64</home>
;; <properties/>
;; </jdk>
;; <jdk>
;; <name>JRockit JDK 1.5.0_28-R28.1.3-4.0.1</name>
;; <home>/usr/java/jrockit-jdk1.5.0_28-R28.1.3-4.0.1</home>
;; <properties/>
;; </jdk>
;; <jdk>
;; <name>JRockit JDK 1.6.0_24-R28.1.3-4.0.1</name>
;; <home>/usr/java/jrockit-jdk1.6.0_24-R28.1.3-4.0.1</home>
;; <properties/>
;; </jdk>
;; </jdks>
;; <!-- ... bunch more tags ... -->
;; </hudson>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment