如何从xml.data的解析输入中解析键的值

时间:2012-06-27 17:44:08

标签: xml clojure

在使用: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))))

1 个答案:

答案 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")

你可能希望它能够展平,只是让它打印得更好。