¿Cuál es la forma más fácil de obtener el valor de un elemento de una cadena XML en Clojure? Busco algo como:Obteniendo el valor de un elemento en XML en Clojure?
(get-value "<a><b>SOMETHING</b></a>)" "b")
para volver
"SOMETHING"
¿Cuál es la forma más fácil de obtener el valor de un elemento de una cadena XML en Clojure? Busco algo como:Obteniendo el valor de un elemento en XML en Clojure?
(get-value "<a><b>SOMETHING</b></a>)" "b")
para volver
"SOMETHING"
Prueba esto:
user=> (use 'clojure.xml)
user=> (for [x (xml-seq
(parse (java.io.File. file)))
:when (= :b (:tag x))]
(first (:content x)))
Marque esta link para obtener más información.
Esto es: Clojure XML Parsing ¿no es lo que quieres? Una fuente alternativa (externa) está aquí: http://blog.rguha.net/?p=510.
No sé cómo idiomática Clojure es pero si por casualidad usted conoce y al igual que XPath que puede ser utilizado con bastante facilidad en Clojure debido a su excelente 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"
Usando gran biblioteca Enlive de Christophe Grand:
(require '[net.cgrand.enlive-html :as html])
(map html/text
(html/select (html/html-snippet "<a><b>SOMETHING</b></a>") [:a :b]))
Usando CLJ-XPath, (https://github.com/brehaut/necessary-evil):
(use 'com.github.kyleburton.clj-xpath :only [$x:text])
($x:text "https://stackoverflow.com/a/b" "<a><b>SOMETHING</b></a>)")
Las cremalleras pueden ser útiles para xml, te dan una sintaxis similar a xpath que puedes mezclar con las funciones de clojure nativas.
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)
vuelve
"SOMETHING"
sugeriría esto como mejor enfoque, ya que no sólo es más funcional, sino también más fácil de extender una vez que se cuelgue de ella .. así 1 de la cremallera – Ash