2010-03-15 18 views
10

क्लोजर clojure.xml/parse, clojure.zip/xml-zip और clojure.contrib.zip-filter.xml/xml-> एक्सएमएल से मूल्य खींचने के लिए उत्कृष्ट उपकरण हैं, लेकिन यदि मैं चाहता हूं तो उत्परिवर्तन एक्सएमएल एक्सएमएल-> "प्रश्न" से सीखने के आधार पर xml (clojure.zip/xml-zip का परिणाम) को बदलने के लिए और परिणाम को वापस XML के रूप में लिखें?क्लोजर

मुझे उम्मीद थी कि (clojure.contrib.prxml/prxml (clojure.xml/parse xml-content)) xml वापस थूकें, लेकिन ऐसा नहीं है।

उत्तर

5

अद्यतन: वास्तव में, एक्सएमएल उत्सर्जन के लिए, यह सबसे अच्छा clojure.contrib.lazy-xml/emit उपयोग करने के लिए है, क्योंकि clojure.xml/emit वर्तमान में चीजों को तोड़ने की संभावना है है! नीचे मेरी टिप्पणी देखें।

(इस जवाब यहाँ अभी एक चेतावनी के रूप छोड़कर।)


अगर मैं सही ढंग से समझ, प्रश्न का मुख्य जोर (संभवतः उत्परिवर्तित) एक्सएमएल प्रतिनिधित्व में वापस मोड़ के साथ क्या करना है एक्सएमएल पाठ?

यदि हां, तो clojure.xml/emit और clojure.xml/emit-element पर एक नजर है:

user> (with-out-str (xml/emit {:tag :foo :attrs {:bar "quux"}})) 
"<?xml version='1.0' encoding='UTF-8'?>\n<foo bar='quux'/>\n" 

(with-out-str कैप्चर मुद्रित आउटपुट और एक स्ट्रिंग के रूप में यह ऊपर लपेटता; किसी कारण से xml/emit प्रिंट एक्सएमएल, तो यह यहाँ काम में आता। emit-element का उपयोग करना चाहेंगे यदि <?xml version='1.0' encoding='UTF-8'?> आप जो चाहते हैं वह नहीं है।)

+1

भावी पाठकों के लाभ के लिए: जाहिर है यह इसकी उपयोगिता में बहुत सीमित है, क्योंकि वर्तमान में 'clojure.xml/emit' अपने काम के लिए एक बहुत ही मूर्ख दृष्टिकोण लेता है और उदा। एक्सएमएल इकाइयों के रूप में सामान को एन्कोड करने के लिए उपेक्षा ... इसके बजाय 'clojure.contrib.lazy-xml/emit' का उपयोग करें। फॉलो-अप प्रश्न का मेरा उत्तर भी देखें: http://stackoverflow.com/questions/2463129/roundtripping-xml-in-clojure-using-clojure-xml-parse-and-clojure-xml-emit/2463768#2463768 –

+0

आलसी-एक्सएमएल अब https://github.com/clojure/data.xml/ है – sventechie

7

आप एक्सएमएल-ज़िप लाइब्रेरी का उपयोग एक्सएमएल-एक्सपीएल लाइब्रेरी का उपयोग कर सकते हैं जैसे कि क्लोजर की अपरिवर्तनीय संरचनाओं में से कोई भी। इसमें "उत्परिवर्तन" कार्यों का एक पूरा सेट है: (api)

वे सभी एक संपूर्ण "संशोधित" जिपर लौटाते हैं। फिर आप उस जिपर के शीर्ष पर जा सकते हैं, और एक्सएमएल प्रिंट करने के लिए उपयोगकर्ता xml/emit।