67

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

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

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

(parse-seq file)

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

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

4

2 回答 2

83

假设您的文件中有以下 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"]})

这是有效的,因为关键字可以作为函数运行。请参阅有关 Clojure数据结构中的列表和其他内容的问题:关键字

于 2009-07-28T17:36:46.347 回答
57

上面的答案有效,但我发现它更容易使用clojure.data.zip.xmlclojure-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......我只是看看这里相对较小的源文件,看看有什么可能。这里也有另一个很好的答案。

于 2012-03-07T03:14:53.677 回答