XML में पार्सिंग के लिए सबसे अच्छी लाइब्रेरी कौन सी है [बंद]


158

मैं XML (जटिल कॉन्फ़िगरेशन और डेटा फ़ाइलों) को पार्स करने के लिए जावा लाइब्रेरी खोज रहा हूं, मैं थोड़ा सा गुगला गया लेकिन डोम 4 जे के अलावा अन्य नहीं पाया (ऐसा लगता है कि वे V2 पर काम कर रहे हैं) .. मैंने कॉमन्स कॉन्फ़िगरेशन पर ध्यान दिया है लेकिन नहीं यह पसंद नहीं है, XML पर अन्य अपाचे परियोजनाएं हाइबरनेशन के तहत लगती हैं। मैंने खुद पर dom4j का मूल्यांकन नहीं किया है, लेकिन सिर्फ यह जानना चाहता है - क्या जावा में अन्य (अच्छा) ओपन सोर्स xml पार्सिंग लाइब्रेरी है? और dom4j के साथ आपका अनुभव कैसा है?

@ वू के उत्तर के बाद मुझे एक और पूछना चाहिए - क्या मुझे जावा की अंतर्निहित कक्षाओं या डोम 4 जे जैसी किसी तीसरे पक्ष की लाइब्रेरी का उपयोग करना चाहिए .. क्या फायदे हैं?


क्या आप अच्छे को परिभाषित कर सकते हैं? प्रदर्शन, एपीआई की गुणवत्ता, कुछ और?
यिशै

प्रदर्शन और उपयोग में आसानी (हाँ, एपीआई की गुणवत्ता)
प्रेमराज

3
आपने जावा के मूल कार्यान्वयनों का उपयोग नहीं करने के लिए कोई विशिष्ट कारण पोस्ट नहीं किए हैं।
होवरक्राफ्ट ईल

vtd-xml प्रदर्शन / मेमोरी उपयोग और उपयोग में आसानी के लिए हराने वाला होगा।
vtd-xml- लेखक

जवाबों:


213

वास्तव में जावा XML को बॉक्स से बाहर करने के लिए 4 तरीकों का समर्थन करता है:

DOM Parser / Builder: संपूर्ण XML संरचना को मेमोरी में लोड किया गया है और आप इसके साथ काम करने के लिए प्रसिद्ध डोम तरीकों का उपयोग कर सकते हैं। DOM आपको Xslt परिवर्तनों के साथ दस्तावेज़ को लिखने की अनुमति देता है। उदाहरण:

public static void parse() throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(true);
    factory.setIgnoringElementContentWhitespace(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    File file = new File("test.xml");
    Document doc = builder.parse(file);
    // Do something with the document here.
}

SAX पार्सर: एक XML दस्तावेज़ को पढ़ने के लिए पूरी तरह से। सैक्स पार्सर दस्तावेज़ के माध्यम से चलता है और उपयोगकर्ता के कॉलबैक तरीकों को कॉल करता है। किसी दस्तावेज़, तत्व आदि के आरंभ / अंत की विधियाँ हैं। वे org.xml.sax.ContentHandler में परिभाषित हैं और एक खाली सहायक श्रेणी DefaultHandler है।

public static void parse() throws ParserConfigurationException, SAXException {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setValidating(true);
    SAXParser saxParser = factory.newSAXParser();
    File file = new File("test.xml");
    saxParser.parse(file, new ElementHandler());    // specify handler
}

StAx Reader / Writer: यह डेटास्ट्रीम ओरिएंटेड इंटरफेस के साथ काम करता है। प्रोग्राम अगले तत्व के लिए पूछता है जब यह कर्सर / पुनरावृत्त की तरह तैयार होता है। आप इसके साथ दस्तावेज़ भी बना सकते हैं। दस्तावेज़ पढ़ें:

public static void parse() throws XMLStreamException, IOException {
    try (FileInputStream fis = new FileInputStream("test.xml")) {
        XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
        XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
        while(reader.hasNext()) {
            reader.next(); // do something here
        }
    }
}

दस्तावेज़ लिखें:

public static void parse() throws XMLStreamException, IOException {
    try (FileOutputStream fos = new FileOutputStream("test.xml")){
        XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
        XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
        writer.writeStartDocument();
        writer.writeStartElement("test");
        // write stuff
        writer.writeEndElement();
    }
}

JAXB: XML दस्तावेजों को पढ़ने के लिए नवीनतम कार्यान्वयन: v2 में जावा 6 का हिस्सा है। यह हमें एक दस्तावेज़ से जावा वस्तुओं को क्रमबद्ध करने की अनुमति देता है। आप एक वर्ग के साथ दस्तावेज़ पढ़ते हैं जो javax.xml.bind.Unmarshaller (आपको JAXBContext.newInstance से इसके लिए एक वर्ग मिलता है) के लिए एक इंटरफ़ेस लागू करता है। संदर्भ को उपयोग की गई कक्षाओं के साथ आरंभीकृत किया जाना है, लेकिन आपको केवल रूट कक्षाओं को निर्दिष्ट करना होगा और स्थिर संदर्भित कक्षाओं के बारे में चिंता करने की आवश्यकता नहीं है। आप यह निर्दिष्ट करने के लिए एनोटेशन का उपयोग करते हैं कि कौन से वर्ग तत्व (@XmlRootElement) होने चाहिए और कौन से फ़ील्ड तत्व (@XmlElement) या गुण हैं (@XmlAttribute, क्या आश्चर्य है!)

public static void parse() throws JAXBException, IOException {
    try (FileInputStream adrFile = new FileInputStream("test")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Unmarshaller um = ctx.createUnmarshaller();
        RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
    }
}

दस्तावेज़ लिखें:

public static void parse(RootElementClass out) throws IOException, JAXBException {
    try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Marshaller ma = ctx.createMarshaller();
        ma.marshal(out, adrFile);
    }
}

कुछ पुरानी व्याख्यान स्लाइड से कॉपी किए गए उदाहरण ;-)

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


@ नेटिक्स यही कारण है कि "संपादित करें" विकल्प के लिए है। अब बेहतर होना चाहिए।
किकिवा

4
@Kikiwa एक्सेप्शन हैंडलिंग इस पद के बिंदु से जितना संभव हो उतना दूर हो जाता है। यदि कुछ अक्षम कॉपी-पेस्ट प्रोग्रामर आगे बढ़ जाते हैं और स्निपेट को कॉपी करते हैं, तो उनके उद्देश्य को समझे बिना उन्हें वह मिलता है जिसके वे हकदार हैं। वास्तव में उनके बारे में चिंतित या रूचि नहीं है। मैं क्या कहूंगा कि कोशिश / कैच ब्लॉक्स को हटाने और दस्तावेज़ के बजाय विधि हस्ताक्षर दिखाने से क्या अलग-अलग विकल्प फेंक सकते हैं, यह दिलचस्प जानकारी को संरक्षित करते हुए अंतरिक्ष को बचा सकता है। इसलिए अगर कोई ऐसा करना चाहता है, तो उन्हें आगे बढ़ना चाहिए।
वू सिप

1
(उसी समय मैं उन संपादनों को अस्वीकार कर दूंगा जो अतिरिक्त जानकारी को किसी अन्य तरीके से सूचित किए बिना कोशिश / पकड़ को हटा देते हैं)
वू सिप

मेरा मानना ​​है कि JAXB हाल के संस्करणों में JDK के साथ शामिल नहीं है।
स्लाव

11

जावा बॉक्स से बाहर XML पार्सिंग के लिए दो तरीकों का समर्थन करता है।

SAXParser

यदि आप बड़ी XML फ़ाइलों को पार्स करना चाहते हैं और / या बहुत अधिक मेमोरी का उपयोग नहीं करना चाहते हैं तो आप इस पार्सर का उपयोग कर सकते हैं।

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html

उदाहरण: http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parx/

DOMParser

यदि आपको XPath क्वेरी करने की आवश्यकता है या संपूर्ण DOM उपलब्ध होने की आवश्यकता है, तो आप इस पार्सर का उपयोग कर सकते हैं।

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html

उदाहरण: http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/


5

यदि आप DOM-like API चाहते हैं - अर्थात, जहाँ XML पार्सर दस्तावेज़ को तत्व और गुण नोड्स के पेड़ में बदल देता है - तो वहाँ से चुनने के लिए कम से कम चार हैं: DOM ही, JDOM, DOM4J और XOM। DOM का उपयोग करने का एकमात्र संभावित कारण यह है क्योंकि इसे एक मानक के रूप में माना जाता है और JDK में आपूर्ति की जाती है: अन्य सभी मामलों में, अन्य सभी श्रेष्ठ हैं। सादगी, शक्ति और प्रदर्शन के संयोजन के लिए मेरी अपनी प्राथमिकता, XOM है।

और निश्चित रूप से, प्रसंस्करण की अन्य शैलियाँ हैं: निम्न-स्तरीय पार्सर इंटरफेस (SAX और StAX), डेटा-ऑब्जेक्ट बाइंडिंग इंटरफेस (JAXB), और उच्च-स्तरीय घोषणात्मक भाषा (XSLT, XQuery, XPath)। जो आपके लिए सबसे अच्छा है वह आपकी परियोजना की आवश्यकताओं और आपके व्यक्तिगत स्वाद पर निर्भर करता है।


2
DOM एक W3C मानक ( w3.org/DOM ) है। इस मानक का जावा कार्यान्वयन JAXP मानक ( jcp.org/en/jsr/detail?id=206 ) द्वारा कवर किया गया है । JAXP को अलग-अलग प्रदाताओं द्वारा लागू किया जाता है जैसे: Oracle, Apache, आदि
bdouagan

वास्तव में, कोई भी DOM का उपयोग नहीं करेगा यदि ऐसा नहीं था (a) इसे एक मानक के रूप में परिभाषित किया गया था और इसमें कई कार्यान्वयन हैं, और (b) यह डिफ़ॉल्ट रूप से JDK में शामिल है। अन्य सभी दृष्टिकोणों से, JDOM2 और XOM ज्यादा बेहतर हैं।
माइकल काय

4

निकिता की बात एक उत्कृष्ट है: बुरे के साथ परिपक्व होने को भ्रमित मत करो। XML बहुत बदल नहीं है।

JDOM DOM4J का एक और विकल्प होगा।


आप किसे चुनेंगे और क्यों?
प्रेमराज

1
यह वास्तव में बहुत मायने नहीं रखता है। दोनों जेडीके में निर्मित एसएएक्स और डोम पार्सर के रैपर हैं। W3C दस्तावेज़ पदानुक्रम क्रिया और उपयोग करने में कठिन है, इसलिए DOM4J और JDOM दोनों इसे आसान बनाने का प्रयास करते हैं। मुझे इलियट रस्टी हेरोल्ड पसंद है, इसलिए मैं पहले JDOM के लिए पहुंचता हूं।
duffymo

4

आपको जावा में XML पार्स करने के लिए बाहरी लाइब्रेरी की आवश्यकता नहीं है। जावा उम्र के लिए एसएएक्स और डोम के लिए अंतर्निहित कार्यान्वयन के साथ आया है।


3

JDOM का उपयोग करने में रुचि रखने वाले लोगों के लिए, लेकिन यह डर कि कुछ समय में अपडेट नहीं किया गया है (विशेषकर जावा जेनरिक का लाभ नहीं ले रहा है), CoffeeDOM नामक एक कांटा है जो वास्तव में इन पहलुओं को संबोधित करता है और JDOM API का आधुनिकीकरण करता है, यहां पढ़ें:

http://cdmckay.org/blog/2011/05/20/introducing-coffeedom-a-jdom-fork-for-java-5/

और परियोजना पृष्ठ से इसे डाउनलोड करें:

https://github.com/cdmckay/coffeedom


1

वीटीडी-एक्सएमएल भारी शुल्क एक्सएमएल पार्सिंग लिब है ... यह लगभग हर तरह से दूसरों से बेहतर है ... यहां 2013 का पेपर है जो जावा प्लेटफॉर्म में उपलब्ध सभी एक्सएमएल प्रोसेसिंग फ्रेमवर्क का विश्लेषण करता है ...

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf


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

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