2011-06-13 15 views
7

क्लोजर में किसी XML स्ट्रिंग से किसी तत्व का मान प्राप्त करने का सबसे आसान तरीका क्या है? मैं कुछ ऐसा रहा हूँ:क्लोजर में एक्सएमएल में किसी तत्व का मूल्य प्राप्त करना?

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

वापस जाने के लिए

"SOMETHING" 

उत्तर

5

इस प्रयास करें:

user=> (use 'clojure.xml) 

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

चेक अधिक जानकारी के लिए इस link

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

क्रिस्टोफ़ ग्रैंड के महान लू ए पुस्तकालय का उपयोग करना:

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

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

ज़िप्पर एक्सएमएल के लिए आसान हो सकते हैं, वे आपको xpath सिंटैक्स की तरह देते हैं जिसे आप मूल क्लोजर फ़ंक्शंस के साथ मिश्रित कर सकते हैं।

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" 
.. क्योंकि यह न केवल अधिक कार्यात्मक लेकिन यह भी अधिक आसान एक बार आप इसे की फांसी पाने के विस्तार करने के लिए है
+0

मैं इस रूप में सबसे अच्छा तरीका सुझाव है तो जिपर के +1 – Ash

संबंधित मुद्दे