我無法找到任何有關如何解析XML文檔和訪問元素的信息。Clojure XML解析
我發現兩種方法來解析XML文檔
(clojure.zip/xml-zip (clojure.xml/parse file))
和
(parse-seq file)
,但我似乎找到了如何處理由此產生的結構的任何信息?
源文件是指zip-query.clj關於如何查詢結果,但似乎也缺少。
我無法找到任何有關如何解析XML文檔和訪問元素的信息。Clojure XML解析
我發現兩種方法來解析XML文檔
(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"]}]}
然後您可以在文件的內容中搜索以獲取第Ë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"]})
這工作,因爲關鍵字可以作爲功能操作。見Questions about lists and other stuff in Clojure和Data Structures: Keywords
優秀的答案! – 2010-09-06 10:41:26
以上回答的作品,但我覺得輕鬆了許多使用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這將是(如8月17日 - 2013年):
[org.clojure/data.zip "0.1.1"]
至於文檔的data.zip.xml
...我只是看相對較小的源文件here到看看有什麼可能。另一個好的回答也是here。
來自zip-query.clj的示例可以在xml_test.clj中找到,它位於github倉庫中的src/test/clojure/clojure/data/zip中,用於clojure.data.zip – 2012-04-14 07:30:33
有趣的是,我問這是好的,並從SO上最有幫助的人那裏得到了很好的答案。但是,即使在運行結果解析數據之後。xml通過其中一個建議,所得到的結構對我來說仍然沒有多大意義。我會看看你的xml-zip,除非data.xml是它的後繼者。 – octopusgrabbus 2012-06-29 12:05:55