进一步“解析”内容的库是 clojure.core。那里的函数和宏可以很好地将 XML 生成的数据结构转换为有用的东西。我个人最喜欢的技术是使用两个线程宏,同时使用 first 和关键字函数。如果我需要做的不仅仅是深入挖掘,我将编写一个可以使用 map 的快速函数。
从 clojure.xml/parse 返回的数据结构与 xml 一样深 - 每个元素都有一个包含三个项目的映射,内容是子元素和字符串的向量。它可能看起来更深一些,但它只是将存储的内容的开放表示,例如,在 Java XML 对象中。它的最大优点是您不需要特殊的 API 来使用它 - 您在普通数据上使用的函数也可以在 XML 上工作。如果有的话,您可以编写一些函数来翻译到您的域中,仅此而已。
假设您有以下内容(为简洁起见,我省略了 attrs):
{: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"}
关键是不要将其视为解析,而应将其视为将一种数据结构转换为另一种数据结构。