Basti's Scratchpad on the Internet

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>
Other posts
comments powered by Disqus