Saya minta maaf untuk pertanyaan kedua tentang topik yang sama, tapi saya bingung. Apakah ada modul Clojure yang mengikuti lxml, bahkan secara longgar, atau dokumentasi cara berjalan melalui file XML menggunakan Clojure?
Dengan Python, saya dapat membuka file XML menggunakan modul lxml; menguraikan cara saya melalui data; cari tag seperti <DeviceID>, <TamperName>, <SecheduledDateTime>
, lalu lakukan tindakan berdasarkan nilai salah satu tag tersebut.
Di Clojure, saya telah diberikan jawaban yang sangat bagus tentang cara mengurai menggunakan data.xml dan kemudian mengurangi lebih lanjut informasi yang diurai data.xml dengan menarik nilai tag :content dan meletakkan informasi tersebut di tree-seq.
Namun, bahkan data yang dihasilkan tersebut memiliki tag peta lain yang tertanam, yang jelas tidak merespons fungsi kunci dan vals.
Saya dapat mengambil data ini dan menggunakan penelusuran ekspresi reguler, tetapi saya merasa ada sesuatu yang lebih sederhana yang hilang.
Data langsung dari data.xml/parse (memanggil ret-xml-data
) terlihat seperti ini, menggunakan berbagai (xml parsing pertama) dan perintah lain di REPL:
[: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}")}
Berikut adalah kode Clojure yang saya miliki sejauh ini:
(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)))))
Saya rasa saya mungkin telah menemukan pola berulang pada data yang memungkinkan saya menguraikannya tanpa membuat gado-gado:
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"))
Terima kasih seperti biasa.
Sunting: Tambahkan beberapa pengujian lagi.
Data yang dihasilkan, jika saya menelusuri struktur tree-seq menggunakan fungsi seperti doseq, mungkin sekarang dapat diuraikan dengan tindakan yang diambil.
clojure.pprint/pprint
(saya rasa saya ingat betul). Ini akan secara otomatis membuat indentasi semuanya dengan baik. - person deterb   schedule 13.07.2012