我對同一主題的第二個問題表示歉意,但我很困惑。是否有一個遵循lxml的Clojure模塊,甚至是鬆散的,或者如何使用Clojure瀏覽XML文件?Clojure模塊是否等價於Python的lxml?
在Python中,我可以使用lxml模塊打開XML文件;通過數據解析我的方式;尋找像<DeviceID>, <TamperName>, <SecheduledDateTime>
這樣的標籤,然後根據其中一個標籤的值執行操作。
在Clojure中,我已經給出瞭如何使用data.xml進行解析的優秀答案,然後通過提取:content標記的val並將信息放入樹狀seq來進一步減少data.xml解析的信息。
但是,即使是由此產生的數據也嵌入了其他地圖標記,這顯然不會響應鍵和vals函數。
我可以採取這些數據並使用正則表達式搜索,但我覺得我錯過了更簡單的事情。
數據右出data.xml中/解析的(呼叫ret-xml-data
)看起來像這樣,使用各種(首先被解析的XML)和其他命令在REPL:
[:tag :TamperExport]
[:attrs {}]
:content
#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")} :attrs {},
:content ("{06643D9B-DCD3-459B-86A6-D21B20A03576}")}
這裏是Clojure的代碼我到目前爲止有:
(defn ret-xml-data
"Returns a map of the supplied xml file, as parsed by data.xml/parse."
[xml-fnam]
(let [input-xml (try
(java.io.FileInputStream. xml-fnam)
(catch Exception e))]
(if-not (nil? input-xml)
(xmld/parse input-xml)
nil)))
(defn gen-xml-content-tree
"Returns a tree-seq with :content extracted."
[parsed-xml]
(map :content (first (tree-seq :content :content (:content parsed-xml)))))
我想我可能已經找到了一個可重複的圖案,讓我來分析這個不創建一個大雜燴的數據:
xml-lib.core=> (first (second cl1))
#clojure.data.xml.Element{:tag :DeviceId, :attrs {}, :content ("80580608")}
xml-lib.core=> (keys (first (second cl1)))
(:tag :attrs :content)
xml-lib.core=> (vals (first (second cl1)))
(:DeviceId {} ("80580608"))
謝謝你一如既往。
編輯: 添加一些更多的測試。
如果我使用像doseq這樣的函數來遍歷tree-seq結構,可能現在可以通過採取的操作來解析結果數據。
「嵌入的其他地圖標記」究竟是什麼意思? – deterb
我無法在文本編輯器中輕鬆查看樹結構,因此元素顯示爲彼此嵌入。基本上,我想要的標籤給我時間/日期,endpointid,和任何其他信息嵌入。我通過過濾出來了我想要的東西:內容。這給了我一個更簡單的地圖。 – octopusgrabbus
你有沒有嘗試過使用'clojure.pprint/pprint'(我想我記得那是正確的)。它會自動縮進一切。 – deterb