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>