Search code examples
xmlclojureclojure-contrib

Clojure XML Parsing


I can not find any info on how to parse xml documents and access elements.

I have found two ways to parse the xml document

(clojure.zip/xml-zip (clojure.xml/parse file))

and

(parse-seq file)

but i can seem to find any info on how to process the resulting structure?

Source file's refers to zip-query.clj on how to query the result but that seems to missing too.


Solution

  • Suppose you have the following xml to parse in your file:

    <high-node>
       <low-node>my text</low-node>
    </high-node>
    

    you load clojure.xml:

    user=> (use 'clojure.xml)
    

    when parsed, the xml will have the following structure:

    {:tag :high-node, :attrs nil, :content [{:tag :low-node, :attrs nil, :content ["my text"]}]}
    

    and then you can seq over the content of the file to get the content of the low-node:

    user=> (for [x (xml-seq 
                  (parse (java.io.File. file)))
                     :when (= :low-node (:tag x))]
             (first (:content x)))
    
    ("my text")
    

    Similarly, if you wanted to have access to the entire list of information on low-node, you would change the :when predicate to (= (:high-node (:tag x))):

    user=> (for [x (xml-seq 
                  (parse (java.io.File. file)))
                     :when (= :high-node (:tag x))]
             (first (:content x)))
    
    ({:tag :low-node, :attrs nil, :content ["my text"]})
    

    This works because the keywords can operate as functions. See Questions about lists and other stuff in Clojure and Data Structures: Keywords