在Clojure中获取XML中元素的值?

时间:2011-06-13 09:20:30

标签: xml clojure

在Clojure中从XML字符串中获取元素值的最简单方法是什么?我正在寻找类似的东西:

(get-value "<a><b>SOMETHING</b></a>)" "b")

返回

"SOMETHING"

6 个答案:

答案 0 :(得分:10)

拉链对于xml来说非常方便,它们为您提供了类似xpath的语法,可以与本机的clojure函数混合使用。

user=> (require '[clojure zip xml] '[clojure.contrib.zip-filter [xml :as x]])

user=> (def z (-> (.getBytes "<a><b>SOMETHING</b></a>") 
                  java.io.ByteArrayInputStream. 
                  clojure.xml/parse clojure.zip/xml-zip))

user=> (x/xml1-> z :b x/text)

返回

"SOMETHING"

答案 1 :(得分:7)

我不知道它是如何惯用Clojure但是如果你碰巧知道并喜欢XPath它可以很容易地在Clojure中使用,因为它非常出色interoperability with Java

(import javax.xml.parsers.DocumentBuilderFactory) 
(import javax.xml.xpath.XPathFactory)

(defn document [filename]
  (-> (DocumentBuilderFactory/newInstance)
      .newDocumentBuilder
      (.parse filename)))

(defn get-value [document xpath]
  (-> (XPathFactory/newInstance)
      .newXPath
      (.compile xpath)
      (.evaluate document)))

user=> (get-value (document "something.xml") "//a/b/text()")
"SOMETHING"

答案 2 :(得分:6)

使用Christophe Grand的伟大Enlive图书馆:

(require '[net.cgrand.enlive-html :as html])

(map html/text
     (html/select (html/html-snippet "<a><b>SOMETHING</b></a>")  [:a :b]))

答案 3 :(得分:5)

试试这个:

user=> (use 'clojure.xml)

user=> (for [x (xml-seq 
          (parse (java.io.File. file)))
             :when (= :b (:tag x))]
     (first (:content x)))

查看此link了解详情。

答案 4 :(得分:2)

这是:Clojure XML Parsing不是你想要的吗? 另一个(外部)来源是:http://blog.rguha.net/?p=510

答案 5 :(得分:2)

使用clj-xpath,(https://github.com/brehaut/necessary-evil):

(use 'com.github.kyleburton.clj-xpath :only [$x:text])
($x:text "/a/b" "<a><b>SOMETHING</b></a>)")