在使用:content键提取值后,我无法弄清楚解析的xml输入中的元素是什么。给定以下解析的xml输入,如何提取所有: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")} #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))))
答案 0 :(得分:3)
这基本上归结为走树并选择所有:内容。你可以用clojure.zip(Functional Zippers)做更多的事情,虽然在这种情况下,当你真正需要的是一个树步行时,它有点沉重。
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")
你可能希望它能够展平,只是让它打印得更好。