2011-06-13 19 views

Respuesta

5

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.

7

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" 
6

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])) 
10

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" 
+0

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

Cuestiones relacionadas