xml ドキュメントを解析して要素にアクセスする方法に関する情報が見つかりません。
XMLドキュメントを解析する2つの方法を見つけました
(clojure.zip/xml-zip (clojure.xml/parse file))
と
(parse-seq file)
しかし、結果の構造を処理する方法に関する情報を見つけることができますか?
ソースファイルは、結果を照会する方法について zip-query.clj を参照していますが、それも欠落しているようです。
xml ドキュメントを解析して要素にアクセスする方法に関する情報が見つかりません。
XMLドキュメントを解析する2つの方法を見つけました
(clojure.zip/xml-zip (clojure.xml/parse file))
と
(parse-seq file)
しかし、結果の構造を処理する方法に関する情報を見つけることができますか?
ソースファイルは、結果を照会する方法について zip-query.clj を参照していますが、それも欠落しているようです。
ファイル内に解析する次の 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 and Data Structures: Keywordsのリストやその他のものに関する質問を参照してください。
上記の答えはうまくいきますが、使いやすいと思います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 では(2013年8月17日現在):
[org.clojure/data.zip "0.1.1"]
ドキュメントについては...ここでdata.zip.xml
比較的小さなソースファイルを見て、何が可能かを確認します。ここでも別の良いSO答えがあります。