ฉันขอโทษสำหรับคำถามที่สองในหัวข้อเดียวกัน แต่ฉันสับสน มีโมดูล Clojure ที่ตาม lxml แม้จะหลวม ๆ หรือมีเอกสารประกอบวิธีการอธิบายไฟล์ XML โดยใช้ Clojure หรือไม่
ใน Python ฉันสามารถเปิดไฟล์ XML โดยใช้โมดูล lxml แยกวิเคราะห์ข้อมูลของฉัน มองหาแท็ก เช่น <DeviceID>, <TamperName>, <SecheduledDateTime>
จากนั้นดำเนินการตามค่าของแท็กใดแท็กหนึ่งเหล่านั้น
ใน Clojure ฉันได้รับคำตอบที่ยอดเยี่ยมเกี่ยวกับวิธีการแยกวิเคราะห์โดยใช้ data.xml แล้วลดข้อมูลที่แยกวิเคราะห์ data.xml เพิ่มเติมโดยการดึง vals ของแท็ก :content ออกมา และใส่ข้อมูลใน tree-seq
อย่างไรก็ตาม แม้ว่าข้อมูลผลลัพธ์นั้นจะมีแท็กแผนที่อื่นๆ ฝังอยู่ ซึ่งเห็นได้ชัดว่าไม่ตอบสนองต่อฟังก์ชันคีย์และ vals
ฉันสามารถนำข้อมูลนี้ไปใช้และใช้การค้นหาด้วยนิพจน์ทั่วไป แต่ฉันรู้สึกว่าฉันขาดสิ่งที่ง่ายกว่านี้ไปมาก
ข้อมูลทันทีที่ data.xml/parse (เรียก ret-xml-data
) มีลักษณะเช่นนี้ โดยใช้คำสั่งต่างๆ (first parsed-xml) และคำสั่งอื่นๆ ที่ 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}")}
นี่คือรหัส 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"))
ขอบคุณเช่นเคย.
แก้ไข: เพิ่มการทดสอบเพิ่มเติม
ข้อมูลผลลัพธ์ที่ได้หากฉันรันผ่านโครงสร้าง tree-seq โดยใช้ฟังก์ชันเช่น doseq ตอนนี้อาจถูกแยกวิเคราะห์พร้อมการดำเนินการที่ดำเนินการไปแล้ว
clojure.pprint/pprint
แล้วหรือยัง (ฉันคิดว่าฉันจำไม่ผิด) มันจะเยื้องทุกอย่างอย่างสวยงามโดยอัตโนมัติ - person deterb   schedule 13.07.2012