Pretty Printing XML with Clojure

The other day, I did some XML cleanup. I am posting the snippet here for safekeeping purposes in case I need to refer to it later.

 (defn ppxml [xml]
   (let [in (javax.xml.transform.stream.StreamSource.
             (java.io.StringReader. xml))
         writer (java.io.StringWriter.)
         out (javax.xml.transform.stream.StreamResult. writer)
         transformer (.newTransformer 
                      (javax.xml.transform.TransformerFactory/newInstance))]
     (.setOutputProperty transformer 
                         javax.xml.transform.OutputKeys/INDENT "yes")
     (.setOutputProperty transformer 
                         "{http://xml.apache.org/xslt}indent-amount" "2")
     (.setOutputProperty transformer 
                         javax.xml.transform.OutputKeys/METHOD "xml")
     (.transform transformer in out)
     (-> out .getWriter .toString)))

Now you can pass your XML string,

(ppxml "<root><child>aaa</child><child/></root>")

and get the pretty printed version,

 <?xml version="1.0" encoding="UTF-8"?>
 <root>
   <child>aaa</child>
   <child/>
 </root>

You can also use it to pretty print Compojure output either manually,

 (ppxml (html
         [:html
          [:head
           [:title "Hello World"]]
          [:body "Hello World!"]]))

or using a middleware,

 (defn with-ppxml [handler]
   (fn [request]
     (let [response (handler request)]
       (assoc response :body (ppxml (:body response))))))

and have your pretty printed HTML,

 <html> 
   <head> 
     <title>Hello World</title> 
   </head> 
   <body>Hello World!</body> 
 </html>