Clojure Анализ XML
Я не могу найти информацию о том, как анализировать XML-документы и элементы доступа.
Я нашел два способа анализа XML-документа
(clojure.zip/xml-zip (clojure.xml/parse file))
и
(parse-seq file)
но я могу найти любую информацию о том, как обрабатывать результирующую структуру?
Исходный файл относится к zip-query.clj о том, как запросить результат, но, похоже, тоже отсутствует.
Ответы
Ответ 1
Предположим, у вас есть следующий xml для анализа в вашем файле:
<high-node>
<low-node>my text</low-node>
</high-node>
вы загружаете clojure.xml
:
user=> (use 'clojure.xml)
при анализе xml будет иметь следующую структуру:
{:tag :high-node, :attrs nil, :content [{:tag :low-node, :attrs nil, :content ["my text"]}]}
а затем вы можете найти содержимое файла, чтобы получить содержимое low-node
:
user=> (for [x (xml-seq
(parse (java.io.File. file)))
:when (= :low-node (:tag x))]
(first (:content x)))
("my text")
Аналогично, если вы хотите получить доступ ко всему списку информации о низком node, вы измените предикат :when
на (= (:high-node (:tag x)))
:
user=> (for [x (xml-seq
(parse (java.io.File. file)))
:when (= :high-node (:tag x))]
(first (:content x)))
({:tag :low-node, :attrs nil, :content ["my text"]})
Это работает, потому что ключевые слова могут работать как функции. См. Вопросы о списках и других материалах в Clojure и Структуры данных: Ключевые слова
Ответ 2
Вышеупомянутый ответ работает, но мне гораздо проще использовать clojure.data.zip.xml
(раньше clojure-contrib.zip-filter.xml
до Clojure 1.3).
Файл:
myfile.xml
:
<songs>
<track id="t1"><name>Track one</name></track>
<track id="t2"><name>Track two</name></track>
</songs>
код:
; Clojure 1.3
(ns example
(:use [clojure.data.zip.xml :only (attr text xml->)]) ; dep: see below
(:require [clojure.xml :as xml]
[clojure.zip :as zip]))
(def xml (xml/parse "myfile.xml"))
(def zipped (zip/xml-zip xml))
(xml-> zipped :track :name text) ; ("Track one" "Track two")
(xml-> zipped :track (attr :id)) ; ("t1" "t2")
К сожалению, вам нужно найти зависимость от data.zip, чтобы получить эту приятную функцию чтения/фильтрации. Это стоит зависимости:) В lein было бы (с 17 августа 2013 года):
[org.clojure/data.zip "0.1.1"]
А что касается документов для data.zip.xml
... Я просто смотрю на относительно небольшой исходный файл здесь, чтобы узнать, что возможно. Еще один хороший ответ SO здесь.