Прошу прощения за второй вопрос по той же теме, но я запутался. Есть ли модуль Clojure, который следует за lxml, хотя бы в общих чертах, или документация с практическими рекомендациями о том, как пройтись по XML-файлу с помощью Clojure?
В Python я могу открыть файл XML с помощью модуля lxml; анализировать мой путь через данные; найдите такие теги, как <DeviceID>, <TamperName>, <SecheduledDateTime>
, а затем выполните действие на основе значения одного из этих тегов.
В Clojure мне дали отличные ответы о том, как выполнять синтаксический анализ с использованием data.xml, а затем дополнительно сокращать проанализированную в data.xml информацию, извлекая значения тега :content и помещая информацию в древовидную последовательность.
Однако даже в эти результирующие данные встроены другие теги карты, которые, очевидно, не реагируют на функции key и 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"))
Спасибо, как всегда.
Изменить: добавить еще несколько тестов.
Результирующие данные, если бы я пробежался по структуре дерева-последовательности, используя функцию вроде дозы, теперь, вероятно, можно было бы проанализировать с помощью предпринятых действий.
clojure.pprint/pprint
(кажется, я правильно запомнил). Он автоматически сделает отступы все красиво. - person deterb   schedule 13.07.2012