Ham*_*aya 65 xml clojure clojure-contrib
我找不到有关如何解析xml文档和访问元素的任何信息.
我找到了两种解析xml文档的方法
(clojure.zip/xml-zip (clojure.xml/parse file))
Run Code Online (Sandbox Code Playgroud)
和
(parse-seq file)
Run Code Online (Sandbox Code Playgroud)
但我似乎可以找到有关如何处理结果结构的任何信息?
源文件是指如何查询结果的zip-query.clj,但似乎也没有.
Pin*_*hle 82
假设您要在文件中解析以下xml:
<high-node>
<low-node>my text</low-node>
</high-node>
Run Code Online (Sandbox Code Playgroud)
你加载clojure.xml
:
user=> (use 'clojure.xml)
Run Code Online (Sandbox Code Playgroud)
解析时,xml将具有以下结构:
{:tag :high-node, :attrs nil, :content [{:tag :low-node, :attrs nil, :content ["my text"]}]}
Run Code Online (Sandbox Code Playgroud)
然后你可以搜索文件的内容以获取以下内容low-node
:
user=> (for [x (xml-seq
(parse (java.io.File. file)))
:when (= :low-node (:tag x))]
(first (:content x)))
("my text")
Run Code Online (Sandbox Code Playgroud)
同样,如果您想要访问低节点上的整个信息列表,您可以将: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"]})
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为关键字可以作为函数运行.请参阅有关Clojure和数据结构中的列表和其他内容的问题:关键字
ove*_*ink 56
上面的答案有效,但我觉得它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>
Run Code Online (Sandbox Code Playgroud)
码:
; 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")
Run Code Online (Sandbox Code Playgroud)
不幸的是,你需要依赖data.zip来获得这个不错的读/过滤功能. 这是值得的依赖:) 在lein它将是(截至2013年8月17日):
[org.clojure/data.zip "0.1.1"]
Run Code Online (Sandbox Code Playgroud)
至于文档的data.zip.xml
...我只是看相对较小的源文件在这里看到什么是可能的.另一个好的SO答案也在这里.
归档时间: |
|
查看次数: |
23955 次 |
最近记录: |