コンテンツをさらに「解析」するためのライブラリは clojure.core です。そこにある関数とマクロは、XML から生成されたデータ構造を有用なものに変換するという非常に優れた仕事をすることができます。私の個人的なお気に入りの手法は、first 関数とキーワード関数を利用しながら、2 つのスレッド化マクロを使用することです。深く掘り下げる以上のことをする必要がある場合は、 map を使用できる簡単な関数を作成します。
clojure.xml/parse から返されるデータ構造は、xml と同じくらい深いものです。各要素には 3 つの項目を持つ 1 つのマップがあり、コンテンツは子要素と文字列のベクトルです。もう少し深く見えるかもしれませんが、これは Java XML オブジェクトなどに格納される内容をオープンに表現したものにすぎません。最大の利点は、特別な API を使用する必要がないことです。通常のデータで使用する関数は、XML でも同様に機能します。どちらかといえば、いくつかの関数を記述してドメインに変換するだけです。
次のようなものがあるとします (簡潔にするために属性は省略しています)。
{:tag :stuff
:content [{:tag item
:content [{:tag :key :content ["Key one"]}
{:tag :value :content ["Item one"]}]}
{:tag item
:content [{:tag :key :content ["Key two"]}
{:tag :value :content ["Item two"]}]}]}
ネストされていますが、各アイテムを使用可能なものに変換するためのユーティリティ関数を作成します。
(defn transform-item [item]
(let [key-element (-> item :content first)
value-element (-> item :content second)]
[(-> key-element :content first)
(-> value-element :content first)]))
そして、それをルート要素のコンテンツにマップします。
(defn transform-stuff [stuff-xml]
(into {} (map transform-item (:content stuff-xml)))
そして、実際にドメインを表すデータが得られるはずです。
{"Key one" "Item One", "Key two" "Item 2"}
重要なのは、それを解析と考えず、あるデータ構造を別のデータ構造に変換するだけだと考えることです。