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

これは基本的に、ツリーを歩き、すべての:contentを選択することになります。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 に答える