Clojure XML解析

Clojure XML解析,xml,clojure,clojure-contrib,Xml,Clojure,Clojure Contrib,我找不到关于如何解析xml文档和访问元素的任何信息 我找到了两种解析xml文档的方法 (clojure.zip/xml-zip (clojure.xml/parse file)) 及 但是我似乎可以找到关于如何处理结果结构的任何信息 关于如何查询结果,源文件引用了zip-query.clj,但这似乎也不存在。假设您的文件中有以下xml要解析: <high-node> <low-node>my text</low-node> </high-node

我找不到关于如何解析xml文档和访问元素的任何信息

我找到了两种解析xml文档的方法

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

但是我似乎可以找到关于如何处理结果结构的任何信息


关于如何查询结果,源文件引用了zip-query.clj,但这似乎也不存在。

假设您的文件中有以下xml要解析:

<high-node>
   <low-node>my text</low-node>
</high-node>
解析后,xml将具有以下结构:

{:tag :high-node, :attrs nil, :content [{:tag :low-node, :attrs nil, :content ["my text"]}]}
然后,您可以对文件的内容进行排序,以获得
低节点的内容

user=> (for [x (xml-seq 
              (parse (java.io.File. file)))
                 :when (= :low-node (:tag x))]
         (first (:content x)))

("my text")
类似地,如果您想访问low node上的整个信息列表,您可以将
:when
谓词更改为
(=(:high node(:tag x))


这是因为关键字可以作为函数进行操作。请参见和

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

文件:

myfile.xml

<songs>
  <track id="t1"><name>Track one</name></track>
  <track id="t2"><name>Track two</name></track>
</songs>
不幸的是,为了获得这种良好的读取/过滤功能,您需要引入对的依赖值得依赖:)从2013年8月17日起:


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

解释得很好!我要试试这个。(免责声明:我是一个clojure新手)。。。但我发现这在REPL中对我有效,我无法将其放入文件中(我的无知是罪魁祸首)。clojure.data.zip.xml在一个没有修改的文件中为我工作。。。试试这个。简短版本:将
(doall…
放在
(for)
周围。zip-query.clj的示例可以在xml_test.clj中找到,它位于github repo for clojure.data.zipFunny的src/test/clojure/data/zip中,我也问了这个问题,并从一些最有帮助的人那里得到了很好的答案。然而,即使通过其中一个建议运行了结果解析的data.xml,结果结构对我来说仍然没有多大意义。我将研究您的xml压缩,除非data.xml是它的继承者。我也不明白为什么(xml->zipped:track:name text)会起作用,但是(xml->zipped:songs:track:name text)不起作用或者(xml->zipped:name text)不起作用。不确定为什么必须指定标记的某个嵌套级别,而不能指定其他级别。@RyanMoore这是一个例子,拉链是上下文敏感的,因为它们有一个当前节点,您必须向它们传递相对于该上下文节点的适当遍历指令。显然,默认的上下文节点是root,这很有意义。
user=> (for [x (xml-seq 
              (parse (java.io.File. file)))
                 :when (= :low-node (:tag x))]
         (first (:content x)))

("my text")
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"]})
<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")
[org.clojure/data.zip "0.1.1"]