Получение значения элемента в XML в Clojure? - PullRequest
7 голосов
/ 13 июня 2011

Какой самый простой способ получить значение элемента из строки XML в Clojure? Я ищу что-то вроде:

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

чтобы вернуть

"SOMETHING"

Ответы [ 6 ]

10 голосов
/ 15 июня 2011

Застежки-молнии могут быть полезны для xml, они дают вам xpath-подобный синтаксис, который вы можете смешивать с собственными функциями clojure.

7 голосов
/ 13 июня 2011

Я не знаю, насколько он идиоматичен для Clojure, но если вы знаете и любите XPath , его можно довольно легко использовать в Clojure из-за его превосходной совместимости с 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"
6 голосов
/ 13 июня 2011

Использование замечательной библиотеки Живого Кристофа Гранда:

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

(map html/text
     (html/select (html/html-snippet "<a><b>SOMETHING</b></a>")  [:a :b]))
5 голосов
/ 13 июня 2011

Попробуйте это:

user=> (use 'clojure.xml)

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

Проверьте эту ссылку для получения дополнительной информации.

2 голосов
/ 15 июня 2011

Используя 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>)")
2 голосов
/ 13 июня 2011

Это: Анализ XML Clojure не то, что вы хотите?Альтернативный (внешний) источник находится здесь: http://blog.rguha.net/?p=510.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...