2009-07-28 63 views
64

我无法找到任何有关如何解析XML文档和访问元素的信息。Clojure XML解析

我发现两种方法来解析XML文档

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

(parse-seq file) 

,但我似乎找到了如何处理由此产生的结构的任何信息?

源文件是指zip-query.clj关于如何查询结果,但似乎也缺少。

+2

来自zip-query.clj的示例可以在xml_test.clj中找到,它位于github仓库中的src/test/clojure/clojure/data/zip中,用于clojure.data.zip – 2012-04-14 07:30:33

+0

有趣的是,我问这是好的,并从SO上最有帮助的人那里得到了很好的答案。但是,即使在运行结果解析数据之后。xml通过其中一个建议,所得到的结构对我来说仍然没有多大意义。我会看看你的xml-zip,除非data.xml是它的后继者。 – octopusgrabbus 2012-06-29 12:05:55

回答

81

假设你有以下的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 ClojureData Structures: Keywords

+0

优秀的答案! – 2010-09-06 10:41:26

52

以上回答的作品,但我觉得轻松了许多使用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