2

clojure で xml ファイルに対して select * スタイルの「クエリ」を実行する方法について質問があります。たとえば、この URL http://api.eventful.com/rest/events/search?app_key=4H4Vff4PdrTGp3vV&keywords=music&location=Belgrade&date=Futureから取得できるこの XML があるとします(ここに貼り付けると、見えません良い)

XML で繰り返されるすべての「行」について、マップのベクトル (キーとその値としてタグを持つマップ) を取得したいと考えています。この例の XML では、すべてのマップがイベントになります。それを解析して、ジッパー構造を作ることができます。また、構造体マップを使用してそれを行う方法も知っていますが、特定の xml に対して、より一般的なソリューションと、開始する開始タグが必要な場合があります。私が欲しいのは、このSimple Clojure XML editの反対です。どんなアイデアも素晴らしいでしょう!

ありがとう!

4

1 に答える 1

2

enliveを見てください。XML を別のリスト/マップ ベースの構造に変換し、それに対するクエリを許可します。

たとえば、すべてのイベントを選択するには、次のようにする必要があります。

(require '[net.cgrand.enlive-html :as html])
(def data (html/xml-resource "your.xml"))
(html/select data [:events])

すべてのイベント タイトルを取得するには:

(select data [:even :title :*])

数ヶ月使用していないので、少し錆びています。しかし、オンラインにはたくさんの資料があります。

編集:

実際にジッパーを使用して、xml-resource によって作成されたデータ構造をナビゲートできます。次の例では、bank という単語が含まれるリンクを探し、そこから上に移動してその親ノードを取得します。

(require [net.cgrand.enlive-html :as html])
(require [net.cgrand.xml :as xml])
(require [clojure.zip :as z])

(map
  (comp z/node z/up)
  (@#'html/zip-select-nodes*
   (map xml/xml-zip (html/html-resource page2))
   (@#'html/automaton
    [:a (html/re-pred #".*[Bb]ank.*")])))

関数 zip-select-nodes* と automaton は名前空間プライベートであるため、@#' を使用する必要があります。

于 2012-09-14T18:30:27.203 に答える