/ / xml.dataの解析された入力からキーの値を解析する方法 - xml、clojure

xml.dataの解析された入力からキーの値を解析する方法 - xml、clojure

私は何が問題なのか理解していない:contentキーを使って値を抽出した後、要素は解析されたXML入力になります。次の解析されたxml入力が与えられた場合、どのようにしてすべての:コンテンツキーの値を抽出できますか?

#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の場合は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")

あなたはそれが平らであることを望むかもしれません、それはちょうどそれがよりうまく印刷するようにします。