3

在我使用 :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 文件中 :content 的一部分。<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))))
4

1 回答 1

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

您可能希望它不会变平,这只会使它打印得更好。

于 2012-06-27T19:01:19.133 回答