Clojure XMLparsing

我找不到任何有关如何parsingXML文档和访问元素的信息。

我已经find了两种方法来parsingXML文档

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

 (parse-seq file) 

但我似乎可以find关于如何处理结果的任何信息?

源文件的引用是关于如何查询结果的zip-query.clj,但是这似乎也丢失了。

假设你有下面的xmlparsing你的文件:

 <high-node> <low-node>my text</low-node> </high-node> 

你加载clojure.xml

 user=> (use 'clojure.xml) 

parsing时,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 predicate to (= (: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"]}) 

这是可行的,因为关键字可以作为function。 查看关于Clojure和数据结构:关键字中的 列表和其他内容的问题

上面的答案是有效的,但是我发现使用clojure.data.zip.xml (在Clojure 1.3之前是clojure-contrib.zip-filter.xmlclojure-contrib.zip-filter.xml

文件:

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来获得这个很好的读/过滤function。 这是值得的依赖:)在这将是(截至2013年8月17日):

 [org.clojure/data.zip "0.1.1"] 

至于data.zip.xml文件…我只是看看这里相对较小的源文件,看看有什么可能的。 另一个很好的答案也在这里 。