在Clojure中读取XML是很容易的。比如我们有一个名叫strings.xml文件:
1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 <string name="site-title">FY行情在线</string> 4 <string name="home">主页</string> 5 </resources>
读取的步骤如下:
1. 在project.clj中添加data.zip的依赖
[org.clojure/data.zip "0.1.1"]
2. 创建一个reader.clj程序(或是其它名字),代码如下:
1 (ns demo.utilities.conf-string-reader 2 (:use [clojure.data.zip.xml :only (attr text xml->)]) ; dep: see below 3 (:require [clojure.xml :as xml] 4 [clojure.zip :as zip])) 5 6 (def xml (xml/parse " strings.xml")) 7 8 (def zipped (zip/xml-zip xml)) 9 10 (defn reader [] 11 (into {} 12 (for [[k v] 13 (map vector 14 (xml-> zipped :string (attr :name)) 15 (xml-> zipped :string text))] 16 [(keyword k) v])))
让我们调用一下reader函数吧,出来的结果就是{:site-title “FY行情在线”, :home “主页”}。
其中,指定读取XML的内容的语句是(xml-> zipped :string text),输出的结果为[“FY行情在线”, “主页”],读取XML的特定属性的语句是(xml-> zipped :string (attr :name)),输出的结果为[“site-title”, “home”]。
至于(into {}….)这个语句的作用是将两个list合并成一个map,而for的作用是将第一个list的值全部转换为keyword。关于这块可以参考我的另一篇文章:《Clojure:如何将两个list合并成一个map》。