现在假定有一个xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<service>
<mongodb>
<uri>localhost</uri>
</mongodb>
<socket>
<port_number>7777</port_number>
<login_timeout>200</login_timeout>
<check_timeout>200</check_timeout>
</socket>
</service>
Clojure提供了clojure.xml来解析xml文件。
启动REPL会话,lein repl
输入下面的命令:
user=> (require 'clojure.xml)
nil
user=> (clojure.xml/parse "/home/chenshu/a.xml")
{:tag :service, :attrs nil, :content [{:tag :mongodb, :attrs nil, :content [{:tag :uri, :attrs nil, :content ["localhost"]}]} {:tag :socket, :attrs nil, :content [{:tag :port_number, :attrs nil, :content ["7777"]} {:tag :login_timeout, :attrs nil, :content ["200"]} {:tag :check_timeout, :attrs nil, :content ["200"]}]}]}
返回的是一个tree, 用emacs格式化一下看看:
{
:tag :service,
:attrs nil,
:content [
{
:tag :mongodb,
:attrs nil,
:content [
{:tag :uri, :attrs nil, :content ["localhost"]}
]
}
{
:tag :socket,
:attrs nil,
:content [
{:tag :port_number, :attrs nil, :content ["7777"]}
{:tag :login_timeout, :attrs nil, :content ["200"]}
{:tag :check_timeout, :attrs nil, :content ["200"]}
]
}
]
}
有点像JSON,但并不是。
首先这是一个{ }括起来的map,有三个key,分别是:tag, :attrs和:content
:tag的值就是service, 注意前面有:前缀
:attrs的值是nil
:content的值是一个vector,里面包含了两个map
第一个map对应名为mongodb的xml元素
第二个map对应名为socket的xml元素
注意,使用clojure.xml之前需要通过requrie引入这个library,并且运行parse函数时前面要加上namespace
如果不想每次调用函数parse的时候都输入namespace,运行一次下面的程序即可:
user=> (use 'clojure.xml)
nil