同じトピックに関する2番目の質問をお詫びしますが、混乱しています。lxmlに続くClojureモジュールはありますか、それとも大まかに、またはClojureを使用してXMLファイルをウォークスルーする方法に関するハウツードキュメントはありますか?
Pythonでは、 lxmlモジュールを使用してXMLファイルを開くことができます。データを解析します。のようなタグを探し<DeviceID>, <TamperName>, <SecheduledDateTime>
、それらのタグの1つの値に基づいてアクションを実行します。
Clojureでは、data.xmlを使用して解析し、:contentタグの値を取得して情報をtree-seqに入れることにより、data.xmlで解析される情報をさらに減らす方法について優れた回答が得られました。
ただし、その結果のデータでさえ、他のマップタグが埋め込まれているため、キーやvals関数に応答しないことは明らかです。
このデータを取得して正規表現検索を使用することはできますが、もっと単純なものが欠けているように感じます。
data.xml / parse(呼び出しret-xml-data
)からのデータは、REPLでさまざまな(最初のparsed-xml)およびその他のコマンドを使用して次のようになります。
[:tag :TamperExport]
[:attrs {}]
: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")} :attrs {},
:content ("{06643D9B-DCD3-459B-86A6-D21B20A03576}")}
これが私がこれまでに持っているClojureコードです:
(defn ret-xml-data
"Returns a map of the supplied xml file, as parsed by data.xml/parse."
[xml-fnam]
(let [input-xml (try
(java.io.FileInputStream. xml-fnam)
(catch Exception e))]
(if-not (nil? input-xml)
(xmld/parse input-xml)
nil)))
(defn gen-xml-content-tree
"Returns a tree-seq with :content extracted."
[parsed-xml]
(map :content (first (tree-seq :content :content (:content parsed-xml)))))
ホッジポッドを作成せずにこれを解析できるようにする、データの繰り返し可能なパターンを見つけた可能性があると思います。
xml-lib.core=> (first (second cl1))
#clojure.data.xml.Element{:tag :DeviceId, :attrs {}, :content ("80580608")}
xml-lib.core=> (keys (first (second cl1)))
(:tag :attrs :content)
xml-lib.core=> (vals (first (second cl1)))
(:DeviceId {} ("80580608"))
いつもありがとうございます。
編集:さらにいくつかのテストを追加します。
結果のデータは、doseqのような関数を使用してtree-seq構造を実行した場合、実行されたアクションで解析できる可能性があります。