I\'m confused as how to idiomatically change a xml tree accessed through clojure.contrib\'s zip-filter.xml. Should be trying to do this at all, or is there a better way?
In create-item you mistyped :contents for :content and you should prefer vectors to lists for literals.
(I was going to make a more comprehensive answer but Michal as already written a pretty good one.)
An alternative to zip-filter is Enlive:
(require '[net.cgrand.enlive-html :as e]) ;' <- fix SO colorizer
(def db (ref (-> "itemdb.xml" java.io.File. e/xml-resource))
(defn create-item [name desc]
{:tag :item
:attrs {:id "3"}
:content [{:tag :name :attrs {} :content [name]}
{:tag :desc :attrs {} :content [desc]}]})
(def fred-item (create-item "Fred" "Green-haired astrophysicist."))
(dosync (alter db (e/transformation [:itemlist] (e/append fred-item))))