Clojure XML Parsing



Я не могу найти никакой информации о том, как анализировать xml-документы и элементы доступа.



Я нашел два способа разбора xml-документа



(clojure.zip/xml-zip (clojure.xml/parse file))


и



(parse-seq file)


но я могу найти любую информацию о том, как обрабатывать полученную структуру?



исходный файл ссылается на zip-запрос.clj о том, как запросить результат, но это, кажется, тоже отсутствует.

502   2  

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

    Ничего не найдено.