जावा के लिए सर्वश्रेष्ठ XML पार्सर [बंद]


387

मुझे स्मॉलिश (कुछ एमबी सबसे अधिक, UTF-8 एनकोडेड) XML फ़ाइलों को पढ़ने की आवश्यकता है, विभिन्न तत्वों और विशेषताओं को देखने के चारों ओर अफवाहें, शायद कुछ को संशोधित करें और डिस्क पर फिर से XML लिख दें (अधिमानतः अच्छा, इंडेंटेड स्वरूपण के साथ) ।

मेरी जरूरतों के लिए सबसे अच्छा XML पार्सर क्या होगा? चुनने के लिए बहुत सारे हैं। कुछ मैं इसके बारे में जानते हैं:

और निश्चित रूप से JDK में एक (मैं जावा 6 का उपयोग कर रहा हूं)। मैं Xerces से परिचित हूं, लेकिन यह क्लंकी लगता है।

सिफारिशें?


6
मुझे लगता है, आप यहां और अधिक खिलाड़ी पा सकते हैं: xml.com/lpt/a/1703
dma_k

1
मुझे लगता है कि इस प्रश्न के साथ वास्तविक समस्याएं हैं। 1 यह है कि यह बिल्कुल विपरीत चीजों की तुलना कर रहा है, डोम-हेरफेर पुस्तकालयों (dom4j, xom, jdom) के साथ पार्सर्स (xerces, क्रिमसन) को एक साथ लंप कर रहा है। उत्तर भी वकालत की ओर हैं और रचनात्मक नहीं हैं।
नाथन ह्यूजेस

51
+220 और रचनात्मक नहीं। स्पष्ट रूप से मध्यस्थों और उपयोगकर्ताओं के पास रचनात्मक दृष्टिकोण है।
ट्रोबबर्ग

5
हाँ, ऐसा लगता है कि जब यह इस तरह के सवालों की बात करता है तो यह बहुत कम होता है। हां, उत्तरों पर विचार किया जाएगा, लेकिन निश्चित रूप से अनुभव के आधार पर और अधिकांश बार उत्तर निर्धारित किए जाते हैं। मॉड को इस प्रश्न को स्थानांतरित करने के लिए संभवतः एक अलग टैग बनाने की आवश्यकता है जो चर्चा के लिए खुले हैं जिसके परिणामस्वरूप रचनात्मक आलोचना और आउटपुट होते हैं।
अशराफ अली वहाब

@dma_k आपकी लिंक काम नहीं कर रही है।
गौरव

जवाबों:


81

यदि गति और मेमोरी कोई समस्या नहीं है, तो dom4j वास्तव में एक अच्छा विकल्प है। यदि आपको गति की आवश्यकता है, तो वुडस्टॉक्स जैसे Stax parser का उपयोग करना सही तरीका है, लेकिन आपको चीजों को प्राप्त करने के लिए अधिक कोड लिखना होगा और धाराओं में XML को संसाधित करने के लिए उपयोग करना होगा।


6
dom4j बहुत अच्छा है, लेकिन निश्चित रूप से समस्याओं के बिना नहीं। अच्छे डोम 4 जे विकल्पों के लिए, stackoverflow.com/questions/831865/…
जॉनिक

@ रेज़र वे थ्रेड-सुरक्षित हैं?
गौरव

257

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

मूल रूप से XML को मानक तरीके से संभालने के तीन तरीके हैं:

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

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

यह कहने की कोई आवश्यकता नहीं है कि सभी (मैंने सभी की जांच नहीं की है, लेकिन पार्सर्स ने प्रस्तावित एक JAXP कार्यान्वयन का अनुपालन किया है, ताकि आप तकनीकी रूप से सभी का उपयोग कर सकें, कोई बात नहीं।


11
दरअसल, 3 तरीके: StAX (javax.xml.stream) तीसरा मानक एक है।
स्टैक्मैन मैन 23:00

1
java-samples.com/showtutorial.php?tutorialid=152 (व्यक्तिगत रूप से SAX से प्यार)
किटोकाइड

@kitokid Chrome मुझे बताता है कि उस पृष्ठ पर गंदा सामान है। मैंने इसके बजाय इसका उपयोग किया: sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Ryan Shillington

अच्छा अवलोकन: केवल एक चीज जिससे मैं असहमत हूं - जबकि वृद्धिशील / स्ट्रीमिंग के लिए, एसएएक्स और स्टैक्स अच्छे हैं, मानक एपीआई पर्याप्त है, डोम के लिए यह मामला नहीं है (आईएमओ): जावा-विशिष्ट के लिए वैध कारण जैसे हैं XOM, JDOM और DOM4J: भाषा-अज्ञेय डोम का उपयोग करने के लिए बहुत बोझिल है।
स्टेक्समैन

130

यहां DOM, SAX, StAX & TrAX (स्रोत: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/soc/SJSXP2.html ) पर एक अच्छी तुलना है

फ़ीचर Stax SAX DOM ट्रैक्स

एपीआई प्रकार                 पुल, स्ट्रीमिंग पुश, मेमोरी ट्री XSLT नियम में स्ट्रीमिंग

          उच्च माध्यम उच्च उपयोग में आसानी

XPath क्षमता    नहीं नहीं हाँ हाँ

सीपीयू और मेमोरी     अच्छा अच्छा भिन्न होता है

फॉरवर्ड ओनली        यस नो नो

XML              हाँ हाँ हाँ हाँ पढ़ें

XML              हाँ नहीं हाँ हाँ लिखें

CRUD                      नहीं नहीं हां नहीं


7
आप SAX के साथ XML लिख सकते हैं। सिंक एक हैंडलर कार्यान्वयन प्रदान करता है जिसे उपयोगकर्ता XML आउटपुट उत्पन्न करने के लिए SAX ईवेंट पर कॉल कर सकता है। (मैं देखता हूं कि तालिका खट्टी है और मूल सामग्री नहीं है, हालांकि तालिका गलत है)
देव


4

SAX और DOM के अलावा XMLXreamReader का उपयोग करके STaX पार्सिंग उपलब्ध है जो एक xml पुल पार्सर है।



2

मैंने यह अनुशंसा नहीं की है कि आपको अपने ऐप में बहुत सारी "सोच" मिल गई है, लेकिन जावा हेरफेर की तुलना में XSLT का उपयोग करना बेहतर (और XSLT-by-bytecode संकलन के साथ बेहतर हो सकता है)।


3
बेहतर, संभव: तेज, बहुत संभावना नहीं है।
StaxMan

XML को पढ़ना, हेरफेर करना और लिखना ठीक वैसा ही है जैसा कि XSLT को करने के लिए बनाया गया है। यह एक अच्छा आउट-ऑफ-द-बॉक्स उत्तर है।
james.garriss

1

यदि आप प्रदर्शन के बारे में कम परवाह करते हैं, तो मैं अपाचे डाइजेस्टर का बहुत बड़ा प्रशंसक हूं, क्योंकि यह अनिवार्य रूप से आपको XML से जावा बीन्स तक सीधे मैप करने देता है।

अन्यथा, आपको पहले पार्स करना होगा, और फिर अपनी वस्तुओं का निर्माण करना होगा।


मुझे जावा बीन्स बनाने की ज़रूरत नहीं है, बस कच्चे XML तत्वों को थोड़ा हेरफेर करें, और उनसे डेटा प्राप्त करने के लिए कुछ तत्वों की समीक्षा करें, इसलिए एक DOM शैली का पार्सर शायद मेरा आदर्श समाधान है।
इवान

हाँ, dom4j शायद वहाँ एक बेहतर समाधान होगा ... मैं इसे भारी उपयोग करता था, जब तक कि मैं एक स्तर तक पाचक तक नहीं जाता
Uri
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.