2012-06-26 91 views
1

是否存在可以在clojure-xml/parse之後或與之配合使用的輔助clojure xml解析項目,如果有,它們是什麼?可用的補充clojure-xml /解析的Clojure XML解析庫

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 [" 

注意與嵌入式地圖的載體。

我當然可以開發一些東西可以用來進一步解析,但我只是想知道模塊是否已經存在。

謝謝。

回答

3

進一步「解析」內容的庫是clojure.core。其中的函數和宏可以很好地將XML生成的數據結構轉換爲有用的東西。我個人最喜歡的技術是在使用第一個和關鍵字函數時使用兩個線程宏。如果我需要做的不僅僅是挖掘深度,我會寫一個快速的函數,我可以使用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"} 

關鍵是不要把它當作解析,而只是把一個數據結構翻譯成另一個。

+0

非常感謝您的回答。 – octopusgrabbus