SAX और DOM में क्या अंतर है?


242

मैंने XML पार्सर के बारे में कुछ लेख पढ़े और SAX और DOM के पार आया ।

SAX ईवेंट-आधारित है और DOM ट्री मॉडल है - मैं इन अवधारणाओं के बीच के अंतर को नहीं समझता।

मैंने जो भी समझा है, घटना-आधारित का मतलब है कि किसी प्रकार की घटना नोड के लिए होती है। जैसे जब कोई एक विशेष नोड पर क्लिक करता है तो यह एक ही समय में सभी नोड्स को लोड करने के बजाय सभी उप नोड्स देगा। लेकिन डोम पार्सिंग के मामले में यह सभी नोड्स को लोड करेगा और ट्री मॉडल बना देगा।

क्या मेरी समझ सही है?

कृपया मुझे सही करें यदि मैं गलत हूं या मुझे सरल तरीके से इवेंट-आधारित और ट्री मॉडल समझाता हूं।


डोम को सही ढंग से बोलना एक पार्सर नहीं है। कोई भी DOM- आधारित सॉफ़्टवेयर मार्कअप पार्सिंग को शामिल नहीं कर सकता है या नहीं कर सकता है, और अधिकांश HTML DOM सॉफ़्टवेयर करता है। लेकिन एक DOM एक पूरी तरह से अलग चीज है जो किसी भी क्रमांकन प्रारूप के साथ संबद्ध नहीं हो सकती है।
15:77 बजे बॉब77

जवाबों:


305

खैर, आप करीब हैं।

SAX में, घटनाओं को ट्रिगर किया जाता है जब XML पार्स किया जाता है । जब पार्सर XML को पार्स कर रहा होता है, और शुरू होने वाले टैग (जैसे <something>) का सामना करता है , तो यह tagStartedईवेंट को ट्रिगर करता है (घटना का वास्तविक नाम भिन्न हो सकता है)। इसी प्रकार जब पार्सिंग ( </something>) के दौरान टैग का अंत मिलता है , तो यह ट्रिगर हो जाता है tagEnded। SAX पार्सर का उपयोग करने से तात्पर्य है कि आपको इन घटनाओं को संभालने की जरूरत है और प्रत्येक घटना के साथ दिए गए डेटा की समझ बनाना चाहिए।

DOM में, पार्स करते समय कोई घटनाएँ ट्रिगर नहीं होती हैं। संपूर्ण XML को पार्स किया जाता है और एक DOM ट्री (XML में नोड्स) उत्पन्न होता है और वापस लौटा दिया जाता है। एक बार पार्स करने के बाद, उपयोगकर्ता XML में विभिन्न नोड्स में एम्बेडेड विभिन्न डेटा तक पहुंचने के लिए ट्री को नेविगेट कर सकता है।

सामान्य तौर पर, DOM का उपयोग करना आसान होता है, लेकिन इसका उपयोग शुरू करने से पहले पूरे XML को पार्स करने का एक ओवरहेड होता है।


135
+1 - स्पष्ट करने के लिए: रैम में फिट होने वाली छोटी फ़ाइलों के साथ DOM पार्सर का उपयोग करें। अभ्यस्त बड़ी फ़ाइलों के लिए SAX पार्सर का उपयोग करें।
रिचर्ड एच।

धन्यवाद @spartkymat लेकिन SAX इवेंट के आधार पर SAX के पार्सर को पता चल सकेगा कि बच्चे का नोड विशेष माता-पिता का बच्चा है? या बस यह पार्स होगा? उदाहरण के लिए। मेरे पास एक <company> है और बच्चा <कर्मचारी> है। तो इस मामले में उन कंपनी और कर्मचारी को बस रोक दिया जाएगा या क्या यह उस संबंध को दिखाएगा कि कंपनी कर्मचारी का माता-पिता है?
user414967

4
यह केवल पार्स करेगा। आपको ऐसी जानकारी खुद (एक राज्य मशीन या अन्यथा के माध्यम से) बनाए रखनी होगी। DOM पार्सर (यदि संसाधन अनुमति दें) :-) का उपयोग करने के लिए सभी अधिक कारण।
स्पार्कटम

1
@ रिचर्ड एच मेरा तर्क है कि किसी को भी एक्सएमएल फ़ाइलों का उपयोग करके वे राम में फिट नहीं होंगे, कुछ बहुत गलत कर रहे हैं।
प्रतिपक्षी

1
40 मीटर आकार के एक एक्सेल को लोड करें, एसएएक्स पार्सर का उपयोग करते समय 200 मीटर मेमोरी का उपयोग करें, लेकिन डोम पार्सर का उपयोग करते समय 9 जी मेमोरी का उपयोग करें।
३-५५ पर zhiyuan_

98

कुछ ही शब्दों में ...

SAX ( S , X ML के लिए A PI को लागू करता है ): एक स्ट्रीम-आधारित प्रोसेसर है। आपके पास किसी भी समय स्मृति में केवल एक छोटा सा हिस्सा है और आप आदि जैसे घटनाओं के लिए कॉलबैक कोड को लागू करके XML स्ट्रीम को "सूँघते हैं" । यह लगभग कोई मेमोरी का उपयोग नहीं करता है, लेकिन आप "डोम" सामान नहीं कर सकते हैं, जैसे xpath या ट्रैवर्स का उपयोग करें पेड़।tagStarted()

DOM ( D ocument O bject M odel): आप पूरी चीज़ को मेमोरी में लोड करते हैं - यह एक बड़े पैमाने पर मेमोरी हॉग है। आप मध्यम आकार के दस्तावेज़ों के साथ मेमोरी को उड़ा सकते हैं। लेकिन आप xpath का उपयोग कर सकते हैं और पेड़ आदि को पार कर सकते हैं।


66

यहाँ सरल शब्दों में:

डोम

  • ट्री मॉडल पार्सर (ऑब्जेक्ट आधारित) (नोड्स का पेड़)।

  • DOM फाइल को मेमोरी में लोड करता है और फिर फाइल को पार्स करता है।

  • स्मृति बाधा है क्योंकि यह पार्स करने से पहले पूरी XML फ़ाइल लोड करता है।

  • DOM को पढ़ा और लिखा जाता है (नोड्स सम्मिलित या हटा सकता है)।

  • यदि XML सामग्री छोटी है, तो DOM पार्सर को प्राथमिकता दें।

  • टैग के अंदर सूचनाओं के टैग और मूल्यांकन की खोज के लिए बैकवर्ड और फॉरवर्ड खोज संभव है। तो यह नेविगेशन की आसानी देता है।

  • रन समय पर धीमा।

SAX

  • ईवेंट आधारित पार्सर (घटनाओं का अनुक्रम)।

  • SAX फ़ाइल को पार्स करता है क्योंकि यह इसे पढ़ता है, यानी नोड द्वारा नोड को पार्स करता है।

  • कोई मेमोरी बाधा नहीं है क्योंकि यह मेमोरी में XML सामग्री को संग्रहीत नहीं करता है।

  • SAX केवल पढ़ा जाता है अर्थात नोड को सम्मिलित या हटा नहीं सकता है।

  • मेमोरी सामग्री बड़ी होने पर SAX पार्सर का उपयोग करें।

  • SAX, XML फ़ाइल को ऊपर से नीचे तक पढ़ता है और बैकवर्ड नेविगेशन संभव नहीं है।

  • रन टाइम पर तेज।


सही ... अंक में कुछ जवाब की उम्मीद थी। अच्छा काम :)
कुणाल गुप्ता

37

आप DOM आधारित मॉडल की अपनी समझ में सही हैं। एक्सएमएल फ़ाइल को एक पूरे के रूप में लोड किया जाएगा और इसकी सभी सामग्री दस्तावेज़ का प्रतिनिधित्व करने वाले पेड़ के इन-मेमोरी प्रतिनिधित्व के रूप में बनाई जाएगी। यह समय- और मेमोरी-खपत हो सकता है, यह निर्भर करता है कि इनपुट फ़ाइल कितनी बड़ी है। इस दृष्टिकोण का लाभ यह है कि आप दस्तावेज़ के किसी भी हिस्से को आसानी से क्वेरी कर सकते हैं, और पेड़ में सभी नोड्स को आसानी से जोड़ सकते हैं।

DOM दृष्टिकोण आमतौर पर छोटे XML संरचनाओं के लिए उपयोग किया जाता है (जहां छोटा यह निर्भर करता है कि आपके प्लेटफॉर्म में कितनी हॉर्स पावर और मेमोरी है) जिन्हें एक बार लोड करने के बाद उन्हें अलग-अलग तरीकों से संशोधित और क्वेर करना पड़ सकता है।

दूसरी ओर SAX को लगभग किसी भी आकार के XML इनपुट को संभालने के लिए डिज़ाइन किया गया है। दस्तावेज़ की संरचना का पता लगाने और सभी नोड्स, विशेषताओं आदि के लिए संभावित रूप से बहुत सारे ऑब्जेक्ट तैयार करने के लिए आपके लिए कड़ी मेहनत कर रहे एक्सएमएल फ्रेमवर्क के बजाय, एसएएक्स पूरी तरह से आपको छोड़ देता है।

यह मूल रूप से क्या करता है ऊपर से इनपुट पढ़ा जाता है और कुछ "ईवेंट" होने पर आपके द्वारा प्रदान की जाने वाली कॉलबैक विधियों को लागू करता है। एक घटना एक उद्घाटन टैग, टैग में एक विशेषता, एक तत्व के अंदर पाठ खोजने या एक अंत-टैग भर में आ रही हो सकती है।

SAX हठपूर्वक इनपुट पढ़ता है और आपको बताता है कि वह इस फैशन में क्या देखता है। यह आप पर निर्भर करता है कि आपको आवश्यक सभी राज्य-जानकारी को बनाए रखना है। आमतौर पर इसका मतलब है कि आप किसी प्रकार की स्टेट-मशीन बनाएंगे।

जबकि XML प्रसंस्करण के लिए यह दृष्टिकोण बहुत अधिक थकाऊ है, यह बहुत शक्तिशाली भी हो सकता है। कल्पना कीजिए कि आप ब्लॉग फ़ीड से समाचार लेखों के शीर्षक निकालना चाहते हैं। यदि आप DOM का उपयोग करके इस XML को पढ़ते हैं तो यह सभी लेख सामग्री, सभी छवियों आदि को लोड कर देगा जो XML में मेमोरी में समाहित हैं, भले ही आप इसमें रुचि नहीं रखते हों।

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

आप मेगाबाइट्स और मेगाबाइट्स एक्सएमएल के माध्यम से इस तरह से पढ़ सकते हैं, बस आपको आवश्यक छोटी मात्रा में डेटा निकाल सकते हैं।

इस दृष्टिकोण का नकारात्मक पक्ष निश्चित रूप से है, कि आपको स्वयं को और अधिक पुस्तक-रखने की आवश्यकता है, जो इस बात पर निर्भर करता है कि आपको XML संरचना को निकालने और कितना जटिल करने की आवश्यकता है। इसके अलावा, आप स्वाभाविक रूप से एक्सएमएल पेड़ की संरचना को संशोधित नहीं कर सकते, क्योंकि आपके पास कभी भी पूरे हाथ में नहीं है।

तो सामान्य तौर पर, एसएएक्स संभावित रूप से बड़ी मात्रा में डेटा के माध्यम से मुकाबला करने के लिए उपयुक्त है जो आपको एक विशिष्ट "क्वेरी" को ध्यान में रखते हुए प्राप्त होता है, लेकिन इसे संशोधित करने की आवश्यकता नहीं है, जबकि डोम आपको बदलने की संरचना और सामग्री में पूर्ण लचीलेपन की कीमत पर दे रहा है। उच्च संसाधन की मांग।


16

आप सेब और नाशपाती की तुलना कर रहे हैं। SAX एक ऐसा पार्सर है जो DOM संरचनाओं को क्रमबद्ध करता है। कई अलग-अलग पार्सर हैं, और "इवेंट-आधारित" पार्सिंग विधि को संदर्भित करता है।

शायद एक छोटा सा पुनरावर्तन क्रम में है:

  • दस्तावेज़ ऑब्जेक्ट मॉडल (डोम) एक सार डाटा मॉडल है कि एक पदानुक्रमित, पेड़-आधारित दस्तावेज़ संरचना का वर्णन करता है; एक दस्तावेज़ ट्री में नोड्स होते हैं , अर्थात् तत्व, विशेषता और पाठ नोड्स (और कुछ अन्य)। नोड्स में माता-पिता, भाई-बहन और बच्चे होते हैं और उन्हें ट्रेस किया जा सकता है, आदि, आपके द्वारा उपयोग किए जाने वाले सभी सामान जावास्क्रिप्ट करने के लिए (जिसका संयोग से डोम के साथ कोई लेना-देना नहीं है)।

  • एक डोम संरचना किया जा सकता है धारावाहिक , यानी एक फाइल करने के लिए लिखा है, HTML या XML की तरह एक मार्कअप भाषा के प्रयोग से। एक HTML या XML फ़ाइल में इस प्रकार एक "डॉक्युमेंट आउट" या एक सार डॉक्यूमेंट ट्री का "चपटा आउट" संस्करण होता है।

  • कंप्यूटर में हेरफेर करने के लिए, या यहां तक ​​कि प्रदर्शित करने के लिए, एक फ़ाइल से एक डोम ट्री, इसे डिसेरिज़लाइज़ करना होगा , या पार्स करना होगा , फ़ाइल और स्मृति में सार पेड़ को फिर से संगठित करना होगा। यहीं से पार्सिंग आती है।

अब हम पार्सर्स की प्रकृति पर आते हैं। पार्स करने का एक तरीका पूरे दस्तावेज़ में पढ़ना और मेमोरी में एक ट्री स्ट्रक्चर का निर्माण करना होगा, और अंत में उपयोगकर्ता को पूरे परिणाम को उजागर करना होगा। (मुझे लगता है कि आप इन पार्सर्स को "डोम पार्सर" कह सकते हैं।) यह उपयोगकर्ता के लिए बहुत आसान होगा (मुझे लगता है कि PHP के XML पार्सर क्या करता है), लेकिन यह स्केलेबिलिटी की समस्याओं से ग्रस्त है और बड़े दस्तावेजों के लिए बहुत महंगा हो जाता है।

दूसरी ओर, इवेंट-आधारित पार्सिंग, जैसा कि एसएएक्स द्वारा किया गया है, फ़ाइल को रैखिक रूप से देखता है और उपयोगकर्ता को कॉल-बैक करता है जब भी यह डेटा के संरचनात्मक टुकड़े का सामना करता है, जैसे "यह तत्व शुरू हुआ", "वह तत्व समाप्त हो गया" , "कुछ पाठ यहाँ", आदि का यह लाभ है कि यह इनपुट फ़ाइल आकार के लिए चिंता के बिना हमेशा के लिए जा सकता है, लेकिन यह बहुत अधिक निम्न-स्तर है क्योंकि इसके लिए उपयोगकर्ता को सभी वास्तविक प्रसंस्करण कार्य करने की आवश्यकता होती है (प्रदान करके कॉल-पीठ)। आपके मूल प्रश्न पर लौटने के लिए, "इवेंट-बेस्ड" शब्द उन पार्सिंग घटनाओं को संदर्भित करता है जो पार्सर उठाता है क्योंकि यह XML फ़ाइल को ट्रेस करता है।

विकिपीडिया लेख SAX पार्सिंग के चरणों पर कई विवरण है।


11

मैं इस प्रश्न के लिए सामान्य प्रश्नोत्तर उत्तर दूंगा:

सवालों के जवाब

हमें XML पार्सर की आवश्यकता क्यों है?

हमें XML पार्सर की आवश्यकता है क्योंकि हम स्क्रैच से अपने एप्लिकेशन में सब कुछ नहीं करना चाहते हैं, और हमें कुछ बहुत ही निम्न-स्तरीय लेकिन हमारे लिए बहुत आवश्यक होने के लिए कुछ "हेल्पर" प्रोग्राम या लाइब्रेरी की आवश्यकता है। इन निम्न-स्तरीय लेकिन आवश्यक चीजों में अच्छी तरह से गठितता की जांच करना, इसके DTD या स्कीमा के खिलाफ दस्तावेज़ को मान्य करना (बस पार्सर्स को मान्य करने के लिए), चरित्र संदर्भ को हल करना, CDATA अनुभागों को समझना, और इसी तरह शामिल हैं। XML पार्सर सिर्फ ऐसे "हेल्पर" प्रोग्राम हैं और वे ये सभी काम करेंगे। XML पार्सर के साथ, हमें इन जटिलताओं के बहुत से परिरक्षित किया जाता है और हम पार्सर्स द्वारा लागू एपीआई के माध्यम से उच्च स्तर पर सिर्फ प्रोग्रामिंग पर ध्यान केंद्रित कर सकते हैं, और इस प्रकार प्रोग्रामिंग दक्षता प्राप्त कर सकते हैं।

कौन सा बेहतर है, SAX या DOM?

SAX और DOM पार्सर दोनों के अपने फायदे और नुकसान हैं। कौन सा बेहतर है, आपके आवेदन की विशेषताओं पर निर्भर होना चाहिए (कृपया नीचे कुछ प्रश्नों को देखें)।

कौन से पार्सर बेहतर गति, डोम या एसएएक्स पार्सर प्राप्त कर सकते हैं?

SAX पार्सर से बेहतर स्पीड मिल सकती है।

ट्री-आधारित API और ईवेंट-आधारित API में क्या अंतर है?

ट्री-आधारित API एक ट्री संरचना के आसपास केंद्रित है और इसलिए एक ट्री के घटकों (जो एक DOM दस्तावेज़ है) पर दस्तावेज़ इंटरफ़ेस, नोड इंटरफ़ेस, नोडलिस्ट इंटरफ़ेस, तत्व इंटरफ़ेस, Attr इंटरफ़ेस और इतने पर इंटरफेस प्रदान करता है। हालांकि, इसके विपरीत, एक घटना-आधारित एपीआई हैंडलर पर इंटरफेस प्रदान करता है। चार हैंडलर इंटरफेस, कंटेंटहैंडलर इंटरफ़ेस, DTDHandler इंटरफ़ेस, EntityResolver इंटरफ़ेस और ErrorHandler इंटरफ़ेस हैं।

DOM पार्सर और SAX पार्सर में क्या अंतर है?

DOM पार्सर और SAX पार्सर विभिन्न तरीकों से काम करते हैं:

  • DOM पार्सर इनपुट डॉक्यूमेंट से मेमोरी में ट्री स्ट्रक्चर बनाता है और फिर क्लाइंट से रिक्वेस्ट का इंतजार करता है। लेकिन एक एसएएक्स पार्सर किसी भी आंतरिक संरचना का निर्माण नहीं करता है। इसके बजाय, यह एक इनपुट दस्तावेज़ के घटकों की घटनाओं को घटनाओं के रूप में लेता है, और क्लाइंट को बताता है कि वह क्या पढ़ता है जैसा कि इनपुट दस्तावेज़ के माध्यम से पढ़ता है। ए

  • DOM पार्सर हमेशा पूरे दस्तावेज़ के साथ क्लाइंट एप्लिकेशन को सेवा देता है, चाहे वह वास्तव में क्लाइंट द्वारा कितनी ही आवश्यक हो। लेकिन एक SAX पार्सर क्लाइंट एप्लिकेशन को हमेशा किसी भी समय दस्तावेज़ के टुकड़ों के साथ कार्य करता है।

  • DOM पार्सर के साथ, क्लाइंट एप्लिकेशन में विधि कॉल को स्पष्ट किया जाना चाहिए और एक प्रकार की श्रृंखला बनती है। लेकिन SAX के साथ, कुछ निश्चित विधियाँ (आमतौर पर cient द्वारा ओवरराइड की जाती हैं) को स्वचालित रूप से (अव्यवस्थित रूप से) एक तरह से लागू किया जाएगा, जिसे कुछ निश्चित घटनाओं के होने पर "कॉलबैक" कहा जाता है। इन तरीकों को ग्राहक द्वारा स्पष्ट रूप से नहीं बुलाया जाना चाहिए, हालांकि हम उन्हें स्पष्ट रूप से कह सकते हैं।

हम कैसे तय करते हैं कि कौन सा पार्सर अच्छा है?

आदर्श रूप से एक अच्छा पार्सर तेज (समय कुशल), अंतरिक्ष कुशल, कार्यक्षमता में समृद्ध और उपयोग में आसान होना चाहिए। लेकिन वास्तव में, मुख्य पार्सरों में से किसी के पास एक ही समय में ये सभी विशेषताएं नहीं हैं। उदाहरण के लिए, एक DOM पार्सर कार्यक्षमता में समृद्ध है (क्योंकि यह मेमोरी में DOM ट्री बनाता है और आपको दस्तावेज़ के किसी भी भाग को बार-बार एक्सेस करने की अनुमति देता है और आपको DOM ट्री को संशोधित करने की अनुमति देता है), लेकिन दस्तावेज़ के विशाल होने पर यह स्थान अक्षम है , और इसके साथ काम करने का तरीका सीखने में थोड़ा समय लगता है। SAX पार्सर, हालांकि, बड़े इनपुट दस्तावेज़ के मामले में अधिक स्थान कुशल है (क्योंकि यह कोई आंतरिक संरचना नहीं बनाता है)। क्या अधिक है, यह तेजी से चलता है और डोम पार्सर की तुलना में सीखना आसान है क्योंकि इसका एपीआई वास्तव में सरल है। लेकिन कार्यक्षमता के दृष्टिकोण से, यह कम कार्य प्रदान करता है जिसका अर्थ है कि उपयोगकर्ताओं को स्वयं का अधिक ध्यान रखना होगा, जैसे कि अपनी स्वयं की डेटा संरचनाएँ बनाना। वैसे, एक अच्छा पार्सर क्या है? मुझे लगता है कि उत्तर वास्तव में आपके आवेदन की विशेषताओं पर निर्भर करता है।

कुछ वास्तविक दुनिया अनुप्रयोग क्या हैं जहां SAX पार्सर का उपयोग DOM पार्सर और इसके विपरीत का उपयोग करने से अधिक फायदेमंद है? DOM पार्सर और SAX पार्सर के लिए सामान्य अनुप्रयोग क्या हैं?

निम्नलिखित मामलों में, एसएएक्स पार्सर का उपयोग डोम पार्सर का उपयोग करने की तुलना में फायदेमंद है।

  • उपलब्ध स्मृति के लिए इनपुट दस्तावेज़ बहुत बड़ा है (वास्तव में इस मामले में एसएएक्स आपकी एकमात्र पसंद है)
  • आप दस्तावेज़ को इनपुट के छोटे सन्निकट विखंडू में संसाधित कर सकते हैं। उपयोगी कार्य करने से पहले आपको संपूर्ण दस्तावेज़ की आवश्यकता नहीं है
  • आप केवल ब्याज की जानकारी निकालने के लिए पार्सर का उपयोग करना चाहते हैं, और आपकी सभी गणना पूरी तरह से स्वयं द्वारा बनाई गई डेटा संरचनाओं पर आधारित होगी। वास्तव में हमारे अधिकांश अनुप्रयोगों में, हम अपने स्वयं के डेटा संरचनाएं बनाते हैं जो आमतौर पर DOM पेड़ के रूप में जटिल नहीं होते हैं। इस अर्थ से, मुझे लगता है, एक डोम पार्सर का उपयोग करने का मौका एक एसएएक्स पार्सर का उपयोग करने की तुलना में कम है।

निम्नलिखित मामलों में, DOM पार्सर का उपयोग SAX पार्सर का उपयोग करने की तुलना में लाभप्रद है।

  • आपके एप्लिकेशन को एक ही समय में दस्तावेज़ के व्यापक रूप से अलग-अलग हिस्सों तक पहुंचने की आवश्यकता है।
  • आपका एप्लिकेशन संभवतः आंतरिक डेटा संरचना का उपयोग कर सकता है जो दस्तावेज़ के रूप में लगभग उतना ही जटिल है।
  • आपके एप्लिकेशन को दस्तावेज़ को बार-बार संशोधित करना होगा।
  • आपके एप्लिकेशन को कई महत्वपूर्ण कॉल के माध्यम से दस्तावेज़ को महत्वपूर्ण समय के लिए संग्रहीत करना होगा।

उदाहरण (DOM पार्सर या SAX पार्सर का उपयोग करें?):

मान लें कि एक प्रशिक्षक के पास एक XML दस्तावेज है जिसमें छात्रों की सभी व्यक्तिगत जानकारी के साथ-साथ उनके छात्रों द्वारा उनकी कक्षा में बनाए गए अंक भी हैं, और वह अब एक आवेदन का उपयोग करके छात्रों के लिए अंतिम ग्रेड प्रदान कर रहा है। वह क्या उत्पादन करना चाहता है, एसएसएन और ग्रेड के साथ एक सूची है। इसके अलावा, हम मानते हैं कि उनके आवेदन में, प्रशिक्षक छात्र की व्यक्तिगत जानकारी और बिंदुओं को संग्रहीत करने के लिए सरणियों जैसे डेटा संरचना का उपयोग नहीं करता है। अगर प्रशिक्षक ए को उन लोगों को देने का फैसला करता है जो वर्ग औसत या उससे अधिक कमाते हैं, और दूसरों को बी देते हैं, तो वह अपने आवेदन में डोम पार्सर का उपयोग करना बेहतर होगा। कारण यह है कि उसके पास यह जानने का कोई तरीका नहीं है कि पूरे दस्तावेज के संसाधित होने से पहले कक्षा का औसत कितना है। शायद उसे अपने आवेदन में क्या करना है, सबसे पहले सभी छात्रों को देखना है अंक और औसत की गणना करें, और फिर दस्तावेज़ के माध्यम से फिर से देखें और प्रत्येक छात्र को वर्ग औसत से अर्जित अंकों की तुलना करके अंतिम ग्रेड प्रदान करें। यदि, हालांकि, प्रशिक्षक ऐसी ग्रेडिंग नीति अपनाता है कि जिन छात्रों को 90 अंक या उससे अधिक मिले, उन्हें ए और अन्य को बी के असाइन किया गया है, तो शायद वह एसएएक्स पार्सर का बेहतर उपयोग करेंगे। इसका कारण है, प्रत्येक छात्र को अंतिम ग्रेड देने के लिए, उसे पूरे दस्तावेज के संसाधित होने की प्रतीक्षा करने की आवश्यकता नहीं है। एसएएक्स पार्सर इस छात्र के ग्रेड को पढ़ता है, तो वह तुरंत एक छात्र को एक ग्रेड प्रदान कर सकता है। उपरोक्त विश्लेषण में, हमने मान लिया कि प्रशिक्षक ने स्वयं की कोई डेटा संरचना नहीं बनाई है। क्या होगा यदि वह SSN को संग्रहीत करने के लिए स्ट्रिंग की एक सरणी और पूर्णांक के एक अंक के रूप में अपनी खुद की डेटा संरचना बनाता है, फिर से अंक प्राप्त करने के लिए? इस मामले में, मुझे लगता है कि SAX एक बेहतर विकल्प है, इससे पहले कि यह मेमोरी और समय दोनों को बचा सकता है, फिर भी काम पूरा कर सकता है। खैर, इस उदाहरण पर एक और विचार। क्या होगा यदि प्रशिक्षक क्या करना चाहता है, सूची को प्रिंट नहीं करना है, बल्कि अद्यतन किए गए प्रत्येक छात्र के ग्रेड के साथ मूल दस्तावेज को वापस बचाना है? इस मामले में, एक DOM पार्सर एक बेहतर विकल्प होना चाहिए, चाहे वह कोई भी ग्रेडिंग नीति अपना रहा हो। उसे अपनी खुद की कोई डेटा संरचना बनाने की आवश्यकता नहीं है। उसे जो करना है, उसे पहले DOM ट्री (यानी, 'ग्रेड' नोड के लिए सेट मूल्य) को संशोधित करना है और फिर पूरे संशोधित पेड़ को बचाना है। यदि वह DOM पार्सर के बजाय SAX पार्सर का उपयोग करने का चयन करता है, तो इस मामले में उसे एक डेटा संरचना तैयार करनी होगी जो कि DOM ट्री के रूप में लगभग जटिल है, इससे पहले कि वह काम कर सके। अभी तक काम नहीं मिला। खैर, इस उदाहरण पर एक और विचार। क्या होगा यदि प्रशिक्षक क्या करना चाहता है, सूची को प्रिंट नहीं करना है, बल्कि अद्यतन किए गए प्रत्येक छात्र के ग्रेड के साथ मूल दस्तावेज को वापस बचाना है? इस मामले में, एक DOM पार्सर एक बेहतर विकल्प होना चाहिए, चाहे वह कोई भी ग्रेडिंग नीति अपना रहा हो। उसे अपनी खुद की कोई डेटा संरचना बनाने की आवश्यकता नहीं है। उसे जो करना है, उसे पहले DOM ट्री (यानी, 'ग्रेड' नोड के लिए सेट मूल्य) को संशोधित करना है और फिर पूरे संशोधित पेड़ को बचाना है। यदि वह DOM पार्सर के बजाय SAX पार्सर का उपयोग करने का विकल्प चुनता है, तो इस मामले में उसे एक डेटा संरचना तैयार करनी होगी जो कि DOM ट्री के रूप में लगभग जटिल है इससे पहले कि वह काम कर सके। अभी तक काम नहीं मिला। खैर, इस उदाहरण पर एक और विचार। क्या होगा यदि प्रशिक्षक क्या करना चाहता है, सूची को प्रिंट नहीं करना है, बल्कि अद्यतन किए गए प्रत्येक छात्र के ग्रेड के साथ मूल दस्तावेज को वापस बचाना है? इस मामले में, एक DOM पार्सर एक बेहतर विकल्प होना चाहिए, चाहे वह कोई भी ग्रेडिंग नीति अपना रहा हो। उसे अपनी खुद की कोई डेटा संरचना बनाने की आवश्यकता नहीं है। उसे जो करना है, उसे पहले DOM ट्री (यानी, 'ग्रेड' नोड के लिए सेट मूल्य) को संशोधित करना है और फिर पूरे संशोधित पेड़ को बचाना है। यदि वह DOM पार्सर के बजाय SAX पार्सर का उपयोग करने का विकल्प चुनता है, तो इस मामले में उसे एक डेटा संरचना तैयार करनी होगी जो कि DOM ट्री के रूप में लगभग जटिल है इससे पहले कि वह काम कर सके। लेकिन अद्यतन किए गए प्रत्येक छात्र के ग्रेड के साथ मूल दस्तावेज को वापस बचाने के लिए? इस मामले में, एक DOM पार्सर एक बेहतर विकल्प होना चाहिए, चाहे वह कोई भी ग्रेडिंग नीति अपना रहा हो। उसे अपनी खुद की कोई डेटा संरचना बनाने की आवश्यकता नहीं है। उसे जो करना है, उसे पहले DOM ट्री (यानी, 'ग्रेड' नोड के लिए सेट मूल्य) को संशोधित करना है और फिर पूरे संशोधित पेड़ को बचाना है। यदि वह DOM पार्सर के बजाय SAX पार्सर का उपयोग करने का विकल्प चुनता है, तो इस मामले में उसे एक डेटा संरचना तैयार करनी होगी जो कि DOM ट्री के रूप में लगभग जटिल है इससे पहले कि वह काम कर सके। लेकिन अद्यतन किए गए प्रत्येक छात्र के ग्रेड के साथ मूल दस्तावेज को वापस बचाने के लिए? इस मामले में, एक DOM पार्सर एक बेहतर विकल्प होना चाहिए, चाहे वह कोई भी ग्रेडिंग नीति अपना रहा हो। उसे अपनी खुद की कोई डेटा संरचना बनाने की आवश्यकता नहीं है। उसे जो करना है, उसे पहले DOM ट्री (यानी, 'ग्रेड' नोड के लिए सेट मूल्य) को संशोधित करना है और फिर पूरे संशोधित पेड़ को बचाना है। यदि वह DOM पार्सर के बजाय SAX पार्सर का उपयोग करने का विकल्प चुनता है, तो इस मामले में उसे एक डेटा संरचना तैयार करनी होगी जो कि DOM ट्री के रूप में लगभग जटिल है इससे पहले कि वह काम कर सके। नोड) और फिर पूरे संशोधित पेड़ को बचाएं। यदि वह DOM पार्सर के बजाय SAX पार्सर का उपयोग करने का विकल्प चुनता है, तो इस मामले में उसे एक डेटा संरचना तैयार करनी होगी जो कि DOM ट्री के रूप में लगभग जटिल है इससे पहले कि वह काम कर सके। नोड) और फिर पूरे संशोधित पेड़ को बचाएं। यदि वह DOM पार्सर के बजाय SAX पार्सर का उपयोग करने का विकल्प चुनता है, तो इस मामले में उसे एक डेटा संरचना तैयार करनी होगी जो कि DOM ट्री के रूप में लगभग जटिल है इससे पहले कि वह काम कर सके।

एक उदाहरण

समस्या कथन : किसी दिए गए XML दस्तावेज़ में तत्वों के बारे में सारी जानकारी निकालने के लिए जावा प्रोग्राम लिखें। हम मानते हैं कि प्रत्येक वृत्त तत्व में तीन बाल तत्व (जैसे, x, y और त्रिज्या) हैं और साथ ही एक रंग विशेषता भी है। एक नमूना दस्तावेज नीचे दिया गया है:

<?xml version="1.0"?> 
<!DOCTYPE shapes [
<!ELEMENT shapes (circle)*>
<!ELEMENT circle (x,y,radius)>
<!ELEMENT x (#PCDATA)>
<!ELEMENT y (#PCDATA)>
<!ELEMENT radius (#PCDATA)>
<!ATTLIST circle color CDATA #IMPLIED>
]>

<shapes> 
          <circle color="BLUE"> 
                <x>20</x>
                <y>20</y>
                <radius>20</radius> 
          </circle>
          <circle color="RED" >
                <x>40</x>
                <y>40</y>
                <radius>20</radius> 
          </circle>
</shapes> 

डॉम्परर के साथ कार्यक्रम

import java.io.*;
import org.w3c.dom.*;
import org.apache.xerces.parsers.DOMParser;


public class shapes_DOM {
   static int numberOfCircles = 0;   // total number of circles seen
   static int x[] = new int[1000];   // X-coordinates of the centers
   static int y[] = new int[1000];   // Y-coordinates of the centers  
   static int r[] = new int[1000];   // radius of the circle
   static String color[] = new String[1000];  // colors of the circles 

   public static void main(String[] args) {   

      try{
         // create a DOMParser
         DOMParser parser=new DOMParser();
         parser.parse(args[0]);

         // get the DOM Document object
         Document doc=parser.getDocument();

         // get all the circle nodes
         NodeList nodelist = doc.getElementsByTagName("circle");
         numberOfCircles =  nodelist.getLength();

         // retrieve all info about the circles
         for(int i=0; i<nodelist.getLength(); i++) {

            // get one circle node
            Node node = nodelist.item(i);

            // get the color attribute 
            NamedNodeMap attrs = node.getAttributes();
            if(attrs.getLength() > 0)
               color[i]=(String)attrs.getNamedItem("color").getNodeValue();

            // get the child nodes of a circle node 
            NodeList childnodelist = node.getChildNodes();

            // get the x and y value 
            for(int j=0; j<childnodelist.getLength(); j++) {
               Node childnode = childnodelist.item(j);
               Node textnode = childnode.getFirstChild();//the only text node
               String childnodename=childnode.getNodeName(); 
               if(childnodename.equals("x")) 
                  x[i]= Integer.parseInt(textnode.getNodeValue().trim());
               else if(childnodename.equals("y")) 
                  y[i]= Integer.parseInt(textnode.getNodeValue().trim());
               else if(childnodename.equals("radius")) 
                  r[i]= Integer.parseInt(textnode.getNodeValue().trim());
            }

         }

         // print the result
         System.out.println("circles="+numberOfCircles);
         for(int i=0;i<numberOfCircles;i++) {
             String line="";
             line=line+"(x="+x[i]+",y="+y[i]+",r="+r[i]+",color="+color[i]+")";
             System.out.println(line);
         }

      }  catch (Exception e) {e.printStackTrace(System.err);}

    }

}

SAXparser के साथ कार्यक्रम

import java.io.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import org.apache.xerces.parsers.SAXParser;


public class shapes_SAX extends DefaultHandler {

   static int numberOfCircles = 0;   // total number of circles seen
   static int x[] = new int[1000];   // X-coordinates of the centers
   static int y[] = new int[1000];   // Y-coordinates of the centers
   static int r[] = new int[1000];   // radius of the circle
   static String color[] = new String[1000];  // colors of the circles

   static int flagX=0;    //to remember what element has occurred
   static int flagY=0;    //to remember what element has occurred
   static int flagR=0;    //to remember what element has occurred

   // main method 
   public static void main(String[] args) {   
      try{
         shapes_SAX SAXHandler = new shapes_SAX (); // an instance of this class
         SAXParser parser=new SAXParser();          // create a SAXParser object 
         parser.setContentHandler(SAXHandler);      // register with the ContentHandler 
         parser.parse(args[0]);
      }  catch (Exception e) {e.printStackTrace(System.err);}  // catch exeptions
   }

   // override the startElement() method
   public void startElement(String uri, String localName, 
                       String rawName, Attributes attributes) {
         if(rawName.equals("circle"))                      // if a circle element is seen
            color[numberOfCircles]=attributes.getValue("color");  // get the color attribute 

         else if(rawName.equals("x"))      // if a x element is seen set the flag as 1 
            flagX=1;
         else if(rawName.equals("y"))      // if a y element is seen set the flag as 2
            flagY=1;
         else if(rawName.equals("radius")) // if a radius element is seen set the flag as 3 
            flagR=1;
   }

   // override the endElement() method
   public void endElement(String uri, String localName, String rawName) {
         // in this example we do not need to do anything else here
         if(rawName.equals("circle"))                       // if a circle element is ended 
            numberOfCircles +=  1;                          // increment the counter 
   }

   // override the characters() method
   public void characters(char characters[], int start, int length) {
         String characterData = 
             (new String(characters,start,length)).trim(); // get the text

         if(flagX==1) {        // indicate this text is for <x> element 
             x[numberOfCircles] = Integer.parseInt(characterData);
             flagX=0;
         }
         else if(flagY==1) {  // indicate this text is for <y> element 
             y[numberOfCircles] = Integer.parseInt(characterData);
             flagY=0;
         }
         else if(flagR==1) {  // indicate this text is for <radius> element 
             r[numberOfCircles] = Integer.parseInt(characterData);
             flagR=0;
         }
   }

   // override the endDocument() method
   public void endDocument() {
         // when the end of document is seen, just print the circle info 
         System.out.println("circles="+numberOfCircles);
         for(int i=0;i<numberOfCircles;i++) {
             String line="";
             line=line+"(x="+x[i]+",y="+y[i]+",r="+r[i]+",color="+color[i]+")";
             System.out.println(line);
         }
   }


}

6

प्रैक्टिकल में: book.xml

<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
</bookstore>
  • DOM स्मृति में निम्नलिखित ट्री-संरचना के रूप में xml दस्तावेज़ प्रस्तुत करता है ।
  • DOM W3C Standard है।
  • DOM पार्सर डॉक्यूमेंट ऑब्जेक्ट मॉडल पर काम करता है।
  • छोटे XML दस्तावेज़ों के लिए अधिमानतः DOM अधिक मेमोरी रखता है
  • DOM आगे या पीछे नेविगेट करना आसान है।

यहां छवि विवरण दर्ज करें


  • SAX xml दस्तावेज़ को इवेंट के आधार पर प्रस्तुत करता है start element:abc, जैसे end element:abc
  • SAX W3C मानक नहीं है, इसे डेवलपर्स के समूह द्वारा विकसित किया गया था।
  • SAX मेमोरी का उपयोग नहीं करता है, बड़े XML दस्तावेजों के लिए पसंद किया जाता है।
  • बैकवर्ड नेविगेशन संभव नहीं है क्योंकि यह दस्तावेजों को क्रमिक रूप से संसाधित करता है।
  • घटना एक नोड / तत्व के साथ होती है और यह सभी उप नोड्स (लैटिन नोडस, 'गाँठ') देती है।

यह XML दस्तावेज़, जब एक एसएएक्स पार्सर के माध्यम से पारित किया जाता है, तो निम्न जैसी घटनाओं का एक क्रम उत्पन्न करेगा :

start element: bookstore
start element: book with an attribute category equal to cooking
start element: title with an attribute lang equal to en
Text node, with data equal to Everyday Italian
....
end element: title
.....
end element: book
end element: bookstore

डोम पार्सिंग के दृश्य प्रतिनिधित्व में attr: "lang"ऊपर क्यों है element: <title>? एक्सएमएल को देखते हुए, ऐसा लगता है कि attrइसके <element>साथ समानांतर होना चाहिए <book>और category। क्या यह केवल एक अंतरिक्ष-बचत तकनीक है या माता-पिता-बच्चे के संबंध का इरादा है?
1252748

यह सिर्फ एक अंतरिक्ष-बचत तकनीक है
प्रेमराज

3

डॉक्यूमेंट ऑब्जेक्ट मॉडल के लिए DOM स्टेंड्स और यह ट्री फॉर्मेट में XML डॉक्युमेंट का प्रतिनिधित्व करता है, जो कि ट्री ब्रांच्स का प्रतिनिधित्व करता है। DOM पार्सर XML फ़ाइल का इन मेमोरी ट्री प्रतिनिधित्व बनाता है और फिर इसे पार्स करता है, इसलिए इसे Java.lang.OutOfMemoryError, जावा हीप स्पेस से बचने के लिए DOM पार्सर के लिए अधिक मेमोरी बढ़ाने की सलाह दी जाती है। DOM पार्सर का उपयोग करके XML फ़ाइल को पार्स करना काफी तेज़ है अगर XML फ़ाइल छोटी है, लेकिन अगर आप DOM पार्सर का उपयोग करके बड़ी XML फ़ाइल को पढ़ने का प्रयास करते हैं तो अधिक संभावना है कि इसमें लंबा समय लगेगा या हो सकता है कि इसे पूरी तरह से लोड न किया जा सके XML डोम ट्री बनाने के लिए बहुत मेमोरी की आवश्यकता होती है। Java DOM Parsing को सपोर्ट करता है और आप DOM पार्सर का उपयोग करके Java में XML फाइल को पार्स कर सकते हैं। DOM क्लासेस w3c.dom पैकेज में हैं जबकि जावा के लिए DOM पार्सर JAXP (XML पार्सिंग के लिए जावा एपीआई) पैकेज में है।

जावा में SAX XML पार्सर

XML पार्सिंग के लिए सरल एपीआई के लिए SAX खड़ा है। यह एक घटना है जो XML पार्सिंग पर आधारित है और यह XML फ़ाइल चरण को बड़े XML फ़ाइलों के लिए उपयुक्त है। SAX XML Parser ईवेंट को आग लगाता है जब इसे शुरुआती टैग, तत्व या विशेषता का सामना करना पड़ता है और तदनुसार पार्सिंग काम करता है। जावा में बड़ी xml फ़ाइलों को पार्स करने के लिए SAX XML पार्सर का उपयोग करने की अनुशंसा की जाती है क्योंकि इसे जावा में संपूर्ण XML फ़ाइल लोड करने की आवश्यकता नहीं होती है और यह छोटे भागों में बड़ी XML फ़ाइल पढ़ सकता है। जावा SAX पार्सर के लिए समर्थन प्रदान करता है और आप SAX Parser का उपयोग करके जावा में किसी भी xml फ़ाइल को पार्स कर सकते हैं, मैंने यहाँ SAX Parser का उपयोग करके xml फ़ाइल पढ़ने का उदाहरण दिया है। जावा में SAX Parser का उपयोग करने का एक नुकसान यह है कि SAX Parser का उपयोग करके जावा में XML फ़ाइल को पढ़ने के लिए DOM Iser की तुलना में अधिक कोड की आवश्यकता होती है।

DOM और SAX XML पार्सर में अंतर

यहाँ जावा में DOM पार्सर और SAX पार्सर के बीच कुछ उच्च स्तर के अंतर हैं:

1) DOM पार्सर पूरे xml डॉक्यूमेंट को मेमोरी में लोड करता है जबकि SAX केवल मेमोरी में XML फ़ाइल के छोटे हिस्से को लोड करता है।

2) DOM पार्सर SAX से तेज़ है क्योंकि यह मेमोरी में पूरे XML डॉक्यूमेंट को एक्सेस करता है।

3) जावा में SAX पार्सर DOM पार्सर की तुलना में बड़ी XML फ़ाइल के लिए बेहतर है क्योंकि इसमें बहुत अधिक मेमोरी की आवश्यकता नहीं होती है।

4) DOM पार्सर डॉक्यूमेंट ऑब्जेक्ट मॉडल पर काम करता है जबकि SAX एक इवेंट आधारित xml पार्सर है।

और पढ़ें: http://javarevisited.blogspot.com/2011/12/difference-between-dom-and-sax-parsers.html#ixzz2uz1bJQqZ


2

XML दस्तावेज़ को पार्स करने के लिए SAX और DOM दोनों का उपयोग किया जाता है। दोनों के फायदे और नुकसान हैं और स्थिति के आधार पर हमारी प्रोग्रामिंग में इसका उपयोग किया जा सकता है

SAX:

  1. पार्स नोड नोड द्वारा

  2. XML को मेमोरी में स्टोर नहीं करता है

  3. हम एक नोड को सम्मिलित या हटा नहीं सकते

  4. ऊपर से नीचे की ट्रेवर्सिंग

डोम

  1. प्रसंस्करण से पहले पूरे XML दस्तावेज़ को मेमोरी में संग्रहीत करता है

  2. अधिक स्मृति पर कब्जा करता है

  3. हम नोड्स को सम्मिलित या हटा सकते हैं

  4. किसी भी दिशा में पार।

यदि हमें एक नोड ढूंढने की आवश्यकता है और हमें सम्मिलित करने या हटाने की आवश्यकता नहीं है, तो हम स्वयं SAX के साथ जा सकते हैं अन्यथा DOM में हमारे पास अधिक मेमोरी है।


1

1) DOM पार्सर पूरे XML दस्तावेज़ को मेमोरी में लोड करता है जबकि SAX मेमोरी में XML फ़ाइल के एक छोटे हिस्से को लोड करता है।

2) DOM पार्सर SAX से तेज़ है क्योंकि यह मेमोरी में पूरे XML डॉक्यूमेंट को एक्सेस करता है।

3) जावा में SAX पार्सर DOM पार्सर की तुलना में बड़ी XML फ़ाइल के लिए बेहतर है क्योंकि इसमें बहुत अधिक मेमोरी की आवश्यकता नहीं होती है।

4) DOM पार्सर डॉक्यूमेंट ऑब्जेक्ट मॉडल पर काम करता है, जबकि SAX एक इवेंट आधारित XML पार्सर है।

और पढ़ें: http://javarevisited.blogspot.com/2011/12/difference-between-dom-and-sax-parsers.html#ixzz498y3vPFR

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.