我找不到有关如何解析 xml 文档和访问元素的任何信息。
我找到了两种解析 xml 文档的方法
(clojure.zip/xml-zip (clojure.xml/parse file))
和
(parse-seq file)
但我似乎可以找到有关如何处理结果结构的任何信息?
源文件是指关于如何查询结果的 zip-query.clj,但这似乎也丢失了。
我找不到有关如何解析 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"]})
这是有效的,因为关键字可以作为函数运行。请参阅有关 Clojure和数据结构中的列表和其他内容的问题:关键字
上面的答案有效,但我发现它更容易使用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中(截至 2013 年 8 月 17 日):
[org.clojure/data.zip "0.1.1"]