Clojure XML Parsing
Я не могу найти никакой информации о том, как анализировать xml-документы и элементы доступа.
Я нашел два способа разбора xml-документа
(clojure.zip/xml-zip (clojure.xml/parse file))
и
(parse-seq file)
но я могу найти любую информацию о том, как обрабатывать полученную структуру?
исходный файл ссылается на zip-запрос.clj о том, как запросить результат, но это, кажется, тоже отсутствует.
2 ответов:
Предположим, у вас есть следующий 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"]}]}и тогда вы можете seq над содержимым файла, чтобы получить содержимое
low-node:user=> (for [x (xml-seq (parse (java.io.File. file))) :when (= :low-node (:tag x))] (first (:content x))) ("my text")аналогично, если бы вы хотели иметь доступ ко всему списку информации на нижнем узле, вы бы изменили
: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 и Структуры Данных: Ключевые Слова
приведенный выше ответ работает, но я нахожу его намного проще в использовании
clojure.data.zip.xml(раньше былоclojure-contrib.zip-filter.xmlдо Clojure 1.3).file:
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")к сожалению, вам нужно тянуть в зависимости от данные.молнии чтобы получить эту хорошую функциональность чтения / фильтра. это стоит зависимости :) In lein это было бы (по состоянию на 17 августа 2013 года):
[org.clojure/data.zip "0.1.1"]а документы для
data.zip.xml... Я просто смотрю на относительно небольшой исходный файл здесь чтобы посмотреть, что можно. Еще один хороший так ответ здесь тоже.
Comments