2011-09-26 11 views
65

मैंने इस विषय पर थोड़ी देर की खोज की और कुछ नतीजे भी पाए, जिनके बारे में मैं पोस्ट के अंत में उल्लेख कर रहा हूं। क्या कोई मुझे नीचे सूचीबद्ध मामलों के लिए इन तीन सवालों का सही जवाब देने में मदद कर सकता है?ग्रोवी XmlSlurper बनाम XmlParser

  1. जो के लिए उपयोग-मामले का उपयोग कर XmlSluper XmlParser और (एपीआई/सिंटेक्स के उपयोग को देखते आसानी के बिंदु से) उपाध्यक्ष प्रतिकूल की तुलना में अधिक समझ में आता है?

  2. कौन सा मेमोरी अधिक कुशल है? (स्लपर की तरह दिखता है)

  3. कौन सा एक्सएमएल तेजी से संसाधित करता है?

केस ए। जब मुझे एक्सएमएल में लगभग सभी नोड्स पढ़ना पड़ता है?

केस बी। जब मुझे केवल कुछ नोड्स पढ़ना पड़ता है (जैसे gpath अभिव्यक्ति का उपयोग करना)?

केस सी। जब मुझे एक्सएमएल अपडेट/ट्रांसफॉर्म करना होगा?

प्रदान किया गया है कि XML दस्तावेज़ छोटा नहीं है (गहराई के स्तर और xml के आकार के साथ)।

संसाधन:

http://www.tutkiun.com/2009/10/xmlparser-and-xmlslurper.html कहता है:

वहाँ XMLParser और XMLSlurper के बीच समानता जब सरल पढ़ने के लिए उपयोग किया जाता है, लेकिन जब हम उनके लिए का उपयोग करें: XMLParser और XMLSlurper के बीच

अंतर उन्नत पढ़ने और जब अन्य प्रारूपों में एक्सएमएल दस्तावेज़ों को संसाधित करते हैं तो अंतर दो के बीच में।

XMLParser दस्तावेज़ों को पार्स करने के बाद मध्यवर्ती परिणाम संग्रहीत करता है। लेकिन पर दूसरी ओर,

XMLSlurper XML दस्तावेज़ों को संसाधित करने के बाद आंतरिक परिणाम संग्रहीत नहीं करता है।

पार्स की गई जानकारी को संसाधित करते समय वास्तविक, मौलिक मतभेद स्पष्ट हो जाते हैं। वह तब होता है जब सीधे इन-प्लेस डेटा स्ट्रीमिंग परिदृश्य में हेरफेर और प्रोसेसिंग के साथ प्रोसेसिंग होती है।

http://groovy.dzone.com/news/john-wilson-groovy-and-xml

ग्रूवी डॉक (XmlParser, XmlSlurper) और ग्रूवी की साइट उन्हें अच्छी तरह से (here और here) बताते हैं लेकिन ऊपर उल्लिखित प्रश्न को समझाने में बहुत अच्छा काम नहीं करता है।

उत्तर

90

XmlSlurper और XmlParser के बीच बड़ा अंतर यह है कि पार्सर एक डोम के समान कुछ बना देगा, जबकि स्लर्पर केवल संरचनाओं को बनाने की कोशिश करता है अगर वास्तव में आवश्यक हो और इस प्रकार पथ का उपयोग किया जाता है, जो आलसी मूल्यांकन किया जाता है। उपयोगकर्ता के लिए दोनों बेहद बराबर लग सकते हैं। अंतर यह है कि पार्सर संरचना का मूल्यांकन केवल एक बार किया जाता है, स्लपर पथ का मूल्यांकन पर मूल्यांकन किया जा सकता है। मांग पर "अधिक मेमोरी कुशल लेकिन धीमी" के रूप में पढ़ा जा सकता है। अंततः यह निर्भर करता है कि आप कितने पथ/अनुरोध करते हैं।आप उदाहरण के लिए केवल XML के एक खास हिस्से में एक विशेषता के मान को पता है और फिर इसे के साथ किया जा चाहते हैं, XmlParser अभी भी सभी की प्रक्रिया और अर्ध डोम पर आपकी क्वेरी को निष्पादित करेंगे। उसमें बहुत सारी ऑब्जेक्ट्स बनाई जाएंगी, मेमोरी और सीपीयू खर्च होंगे। XmlSlurper ऑब्जेक्ट्स नहीं बनाएगा, इस प्रकार मेमोरी और सीपीयू को बचाएगा। यदि आपको दस्तावेज़ के सभी हिस्सों की वैसे भी आवश्यकता है, तो स्लपर लाभ खो देता है, क्योंकि इससे कम से कम ऑब्जेक्ट्स पार्सर की तरह बन जाएंगी।

दोनों दस्तावेज़ पर ट्रांसफॉर्म कर सकते हैं, लेकिन स्लपर का मानना ​​है कि यह स्थिर है और इस प्रकार आपको पहले बदलावों को लिखना होगा और नए एक्सएमएल को पढ़ने के लिए एक नया स्लपर बनाना होगा। पार्सर सही परिवर्तनों को देखने में सहायता करता है दूर।

तो सवाल का जवाब (1), उपयोग के मामले, हो सकता है, कि आप पार्सर का उपयोग आप पूरी एक्सएमएल, slurper इसके बारे में अगर केवल भागों कार्रवाई करने के लिए किया है। एपीआई और वाक्यविन्यास वास्तव में उसमें बहुत अधिक भूमिका निभाते नहीं हैं। ग्रोवी लोग उन दो अनुभवों को उपयोगकर्ता अनुभव में बनाने की कोशिश करते हैं। यदि आप XML में वृद्धिशील परिवर्तन करना चाहते हैं तो आप स्लपर पर पार्सर को भी पसंद करेंगे।

कि भी ऊपर परिचय तो बताता है कि अधिक स्मृति कुशल, सवाल यह है कि (2)। स्लर्पर है, जब तक कि आप सभी में वैसे भी पढ़ते हैं, तो पार्सर हो सकता है, लेकिन मेरे पास वास्तविक संख्या नहीं है कि अंतर कितना बड़ा है।

भी प्रश्न (3) परिचय द्वारा उत्तर दिया जा सकता है। यदि आपके पास कई आलसी मूल्यांकन पथ हैं, तो आपको फिर से eval करना होगा, तो अगर आप पार्सर में मौजूदा ग्राफ को नेविगेट करते हैं तो यह धीमा हो सकता है। तो आपके उपयोग के आधार पर पार्सर तेज हो सकता है।

तो मैं कहूंगा कि (3 ए) लगभग सभी नोड्स को पढ़ने से कोई फर्क नहीं पड़ता है, तब से अनुरोध अधिक निर्धारित कारक होते हैं। लेकिन अगर (3 बी) में मैं कहूंगा कि स्लपर तेज है यदि आपको केवल कुछ नोड्स पढ़ना है, क्योंकि इसे स्मृति में पूरी संरचना नहीं बनाना पड़ेगा, जो कि पहले से ही समय और मेमोरी खर्च करता है।

का सवाल है (3 सी) ... इन दिनों दोनों को अपडेट कर सकते/एक्सएमएल, जो तेजी से होता है को बदलने वास्तव में अधिक से जुड़ा हुआ है कि कितने एक्सएमएल आप बदलना होगा के कुछ हिस्सों। यदि कई हिस्सों में मैं पार्सर कहूंगा, यदि नहीं, तो शायद स्लपर। लेकिन यदि आप उदाहरण के लिए "फ्रेड" से "जॉन" में एक विशेषता मान को स्लर्पर के साथ बदलना चाहते हैं, तो उसी स्लपर का उपयोग करके इस "जॉन" के लिए बाद में पूछताछ के लिए, यह काम नहीं करेगा। संबंध में अद्यतन करने के

+0

बहुत बढ़िया स्पष्टीकरण slurper करने के लिए, धन्यवाद। इसने मेरी समस्या को हल किया जब एक स्लपर में "खाली" होने पर नोड्स को रिकर्सिवली से हटाने की कोशिश की, जो निश्चित रूप से काम नहीं करेगा। – sandos