2

是否有可以在 之后或与 一起使用的辅助 clojure xml 解析项目clojure-xml/parse,如果有,它们是什么?

clojure-xml/parse效果很好,但返回的地图clojure-xml/parse是深度嵌套的,至少在解析我们的一个水切割/篡改 xml 文件之后。我想知道是否存在允许我进一步解析的辅助库。

这里只是我们有意折叠的 xml 文件的一部分,因此您不必滚动。

:content [{:tag :Header, :attrs nil, :content [{:tag :ExportType, 
:attrs nil, :content ["Tamper Export"]} 
{:tag :CurrentDateTime, :attrs nil, :content ["

注意带有嵌入地图的矢量。

我当然可以开发一些可以用来进一步解析它的东西,但我只是想知道一个模块是否已经存在。

谢谢你。

4

1 回答 1

3

进一步“解析”内容的库是 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"}

关键是不要将其视为解析,而应将其视为将一种数据结构转换为另一种数据结构。

于 2012-06-27T04:02:00.820 回答