2012-06-27 41 views
3

我在解析xml輸入時使用:content鍵提取值後,無法找出元素是什麼。鑑於以下解析的xml輸入,我如何提取所有內容鍵的值?如何從xml.data解析的輸入中解析鍵值

#clojure.data.xml.Element{ 
    :tag :Header, 
    :attrs {}, 
    :content (
     #clojure.data.xml.Element{ 
      :tag :ExportType, 
      :attrs {}, 
      :content ("Tamper Export")} 
     #clojure.data.xml.Element{ 
      :tag :CurrentDateTime, 
      :attrs {}, 
      :content ("2012-06-26T15:40:22.063")} 
     #clojure.data.xml.Element{ 
      :tag :ScheduledDateTime, 
      :attrs {}, 
      :content ("2012-06-25T00:00:00")} 
     #clojure.data.xml.Element{ 
      :tag :ExportGuid, 
      :attrs {}, 
      :content ("{06643D9B-DCD3-459B-86A6-D21B20A03576}")} 
     #clojure.data.xml.Element{ 
      :tag :FractionalReadIndicator, 
      :attrs {}, 
      :content ("1")})} 

這個輸出是通過解析使用data.xml中的xml文件創建,然後使用

(first (:content parsed-xml-input)) 

謝謝提取。

下面給我的只是設備類型和設備ID,它只是xml文件中的一部分內容。 <DeviceId>80580608</DeviceId><DeviceType>43</DeviceType>

(defn extract-inner-map-val 
    "Returns a map of embedded :content tag and value." 

    [item] 

    (let [key-elem (-> item :content first) 
      val-elem (-> item :content second)] 

     [(-> key-elem :content first) 
     (-> val-elem :content first)])) 

(defn extract-content-from-map 
    "Accepts a sequence of values associated with a map key, 
    and transforms them into a map of key/value pairs." 

    [parsed-map] 

    (into {} (map extract-inner-map-val (:content parsed-map)))) 

回答

3

這基本上歸結爲走樹和選擇所有的內容。您可以使用clojure.zip(功能拉鍊)來做到這一點和更多,但在這種情況下,當您真正需要的只是一棵樹的行走時,這有點笨重。

user> (pprint 
     (flatten 
     (map :content (first (tree-seq :content :content (:content data)))))) 

("Tamper Export" 
"2012-06-26T15:40:22.063" 
"2012-06-25T00:00:00" 
"{06643D9B-DCD3-459B-86A6-D21B20A03576}" 
"1") 

你可能希望它不會變平,只是讓它打印得更好。

+0

謝謝。我會試試這個。我有一個先前的解決方案,我將編輯原始帖子以反映使用。它給了我一部分數據。 – octopusgrabbus

+0

你在導致你考慮​​樹狀seq的數據中看到了什麼? – octopusgrabbus

+0

我通常使用zippers來解析xml,因爲xml是一個map的樹(至少在它被解析之後)。在這種情況下,我只需要簡單地遍歷樹,所以拉鍊似乎過度殺傷。一般來說,我傾向於將任何具有兩層以上嵌套的東西視爲樹。 –