জাভাতে [বন্ধ] এক্সএমএল পার্সিংয়ের জন্য সেরা গ্রন্থাগার কোনটি?


158

আমি এক্সএমএল (জটিল কনফিগারেশন এবং ডেটা ফাইল) পার্স করার জন্য জাভা লাইব্রেরিটি অনুসন্ধান করছি, আমি কিছুটা জিগল করেছিলাম তবে ডম 4 জে ব্যতীত অন্য কিছু খুঁজে পেলাম না (মনে হচ্ছে তারা ভি 2 তে কাজ করছে) .. আমি কমন্স কনফিগারেশনের দিকে নজর রেখেছি কিন্তু করিনি এটি পছন্দ না, এক্সএমএলে অন্যান্য অ্যাপাচি প্রকল্পগুলি হাইবারনেশনের অধীনে লাগে। আমি নিজের দ্বারা dom4j মূল্যায়ন করি নি তবে কেবল জানতে চেয়েছিলাম - জাভাতে কি অন্যান্য (ভাল) ওপেন সোর্স এক্সএমএল পার্সিং গ্রন্থাগার রয়েছে? এবং dom4j এর সাথে আপনার অভিজ্ঞতা কেমন?

@ ভুর উত্তরের পরে আমাকে আরও একটি জিজ্ঞাসা করতে দিন - আমার কি জাভা অন্তর্নির্মিত ক্লাস বা ডম 4 জ এর মতো কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করা উচিত .. কী কী সুবিধা রয়েছে?


আপনি ভাল সংজ্ঞা দিতে পারেন? পারফরম্যান্স, এপিআই এর মান, অন্য কিছু?
যিশাই

পারফরম্যান্স এবং ব্যবহারের সহজলভ্যতা (হ্যাঁ, এপিআইয়ের গুণমান)
প্রেমরাজ

3
জাভা নেটিভ বাস্তবায়ন ব্যবহার না করার জন্য আপনি কোনও নির্দিষ্ট কারণ পোস্ট করেননি।
পূর্ণ হওরক্রাফ্ট

vtd-xML হ'ল পারফরম্যান্স / মেমরির ব্যবহার এবং সহজলভ্যতার জন্য বীট দেওয়া।
vtd-xML-লেখক

উত্তর:


213

আসলে জাভা বাক্সের বাইরে এক্সএমএলকে পার্স করার জন্য 4 টি পদ্ধতি সমর্থন করে:

ডোম পার্সার / বিল্ডার: পুরো এক্সএমএল কাঠামো মেমরিতে লোড হয়ে গেছে এবং এটির সাথে কাজ করার জন্য আপনি সুপরিচিত ডিওএম পদ্ধতিগুলি ব্যবহার করতে পারেন। ডোম আপনাকে এক্সস্ল্ট ট্রান্সফর্মেশন সহ নথিতে লেখার অনুমতি দেয়। উদাহরণ:

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.
}

স্যাক্স পার্সার: এক্সএমএল ডকুমেন্টটি পড়ার জন্য সম্পূর্ণভাবে। স্যাক্স পার্সারটি দস্তাবেজটির মাধ্যমে চলে এবং ব্যবহারকারীর কলব্যাক পদ্ধতিগুলি কল করে। কোনও নথির শুরু / শেষের পদ্ধতি, উপাদান ইত্যাদি রয়েছে। এগুলি org.xML.sax.ContentHandler এ সংজ্ঞায়িত করা হয়েছে এবং ডিফল্টহ্যান্ডলার একটি খালি সহায়ক শ্রেণি রয়েছে।

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
}

স্টাক্স রিডার / লেখক: এটি একটি ডাস্টাস্ট্রিম ওরিয়েন্টেড ইন্টারফেসের সাথে কাজ করে। প্রোগ্রামটি ঠিক যখন কার্সর / পুনরুক্তি করার মতো প্রস্তুত হয় তখন পরবর্তী উপাদানগুলির জন্য জিজ্ঞাসা করে। আপনি এটি দিয়ে নথিও তৈরি করতে পারেন। দস্তাবেজ পড়ুন:

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();
    }
}

জ্যাকসবি: এক্সএমএল ডকুমেন্টগুলি পড়ার জন্য সর্বশেষতম বাস্তবায়ন: ভি 2 তে জাভা 6 এর অংশ। এটি আমাদের কোনও নথি থেকে জাভা অবজেক্টকে সিরিয়ালাইজ করতে দেয়। আপনি javax.xML.bind.Unmarshaller (আপনি JAXBContext.newInstance থেকে এর জন্য একটি ক্লাস পাবেন) এমন একটি শ্রেণীর সাথে দস্তাবেজটি পড়েন। প্রসঙ্গটি ব্যবহৃত ক্লাসগুলির সাথে শুরু করতে হবে, তবে আপনাকে কেবল মূল শ্রেণি নির্দিষ্ট করতে হবে এবং স্থির রেফারেন্সযুক্ত ক্লাসগুলি নিয়ে চিন্তা করতে হবে না। কোন ক্লাসটি উপাদান হতে হবে তা নির্দিষ্ট করতে আপনি টীকাগুলি ব্যবহার করেন (@ এক্সএমএল রুটএলিমেন্ট) এবং কোন ক্ষেত্রগুলি উপাদান (@ এক্সএমএল উপাদান) বা বৈশিষ্ট্যগুলি (@ এক্সএমএল লেখুন, কী আশ্চর্য!)

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 ব্যবহার করা উচিত?" সম্পর্কে। ভাল এটি নির্ভর করে - আপনি দেখতে যেমন সমস্ত এপিআই এর ক্ষমতা একই থাকে না তবে এক্সএমএল ডকুমেন্টটি মানচিত্রের জন্য আপনি যে ক্লাসগুলি ব্যবহার করেন সেগুলির উপর যদি আপনার নিয়ন্ত্রণ থাকে তবে জ্যাকএক্সবি আমার ব্যক্তিগত প্রিয়, সত্যই মার্জিত এবং সহজ সমাধান (যদিও আমি এটির জন্য এটি ব্যবহার করি নি) সত্যিই বড় দলিল, এটি কিছুটা জটিল হতে পারে)। SAX খুব সহজেই ব্যবহার করা সহজ এবং যদি আপনার এটির ব্যবহার করার সত্যিকারের কোনও উপযুক্ত কারণ না থাকে তবে কেবলমাত্র ডম থেকে দূরে থাকুন - আমার মতে পুরাতন, আড়ম্বরপূর্ণ এপিআই। আমি মনে করি না যে কোনও আধুনিক তৃতীয় পক্ষের লাইব্রেরি রয়েছে যা বিশেষত দরকারী কিছু যা এসটিএল থেকে অনুপস্থিত এবং স্ট্যান্ডার্ড লাইব্রেরিতে অত্যন্ত পরীক্ষিত, নথিভুক্ত এবং স্থিতিশীল হওয়ার স্বাভাবিক সুবিধা রয়েছে।


@ নাটিক্স সে কারণেই "সম্পাদনা" বিকল্পটি। এখনই আরও ভাল হওয়া উচিত।
Kikiwa

4
@ কিকিওয়া ব্যতিক্রম হ্যান্ডলিং যতটা সম্ভব এই পোস্টের পয়েন্ট থেকে প্রায় সরানো হয়েছে। যদি কিছু অযোগ্য অনুলিপি-পেস্ট প্রোগ্রামার এগিয়ে যায় এবং স্নিপেটগুলি তাদের উদ্দেশ্য না বুঝে অনুলিপি করে তবে তারা তাদের প্রাপ্যটি পাবে। তাদের সম্পর্কে সত্যই চিন্তিত বা আগ্রহী নয়। আমি যা বলব তা হ'ল চেষ্টা / ধরার ব্লকগুলি সরিয়ে ফেলা এবং মজাদার তথ্য সংরক্ষণের পরেও বিভিন্ন বিকল্পগুলি কী কী ব্যতিক্রম ছুঁড়ে ফেলতে পারে তার ব্যতিক্রম দলিল করার জন্য পদ্ধতি স্বাক্ষর দেখানো showing সুতরাং কেউ যদি এটি করতে চায় তবে তাদের উচিত কেবল এগিয়ে যাওয়া।
ভু

1
(একই সময়ে আমি এমন সম্পাদনাগুলি প্রত্যাখ্যান করব যা অন্য কোনও উপায়ে অতিরিক্ত তথ্য উল্লেখ না করে চেষ্টা / ধরাকে সরিয়ে ফেলবে)
ভু

আমি বিশ্বাস করি যে সাম্প্রতিক সংস্করণগুলিতে জ্যাকএক্সবি আর জেডিকে-র অন্তর্ভুক্ত নেই।
স্লাও

11

জাভা বাক্সের বাইরে এক্সএমএল পার্স করার জন্য দুটি পদ্ধতি সমর্থন করে।

SAXParser

আপনি যদি বড় আকারের এক্সএমএল ফাইলগুলি পার্স করতে চান এবং / অথবা প্রচুর মেমরি ব্যবহার করতে না চান তবে আপনি এই পার্সারটি ব্যবহার করতে পারেন।

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-parser/

DOMParser

আপনার যদি এক্সপথ প্রশ্নগুলি করতে হয় বা সম্পূর্ণ ডিওএম উপলব্ধ থাকতে হয় তবে আপনি এই পার্সারটি ব্যবহার করতে পারেন।

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

আপনি যদি কোনও ডোম-এর মতো এপিআই চান - এটি, যেখানে এক্সএমএল পার্সার নথিকে এলিমেন্ট এবং অ্যাট্রিবিউট নোডগুলিতে পরিণত করে - তারপরে কমপক্ষে চারটি চয়ন করতে হবে: নিজেই ডিওএম, জেডিএম, ডিওএম 4 জে এবং এক্সওএম। ডিওএম ব্যবহারের একমাত্র সম্ভাব্য কারণ হ'ল এটি একটি মান হিসাবে অনুভূত এবং জেডিকে সরবরাহ করা হয়: অন্য সমস্ত ক্ষেত্রে, অন্যরা সমস্ত উচ্চতর। সরলতা, শক্তি এবং পারফরম্যান্সের সমন্বয়ের জন্য আমার নিজের পছন্দটি হল এক্সওএম।

এবং অবশ্যই, প্রক্রিয়াজাতকরণের অন্যান্য স্টাইলগুলি রয়েছে: নিম্ন-স্তরের পার্সার ইন্টারফেস (এসএএক্স এবং স্টাক্স), ডেটা-অবজেক্ট বাইন্ডিং ইন্টারফেস (জ্যাকএক্সবি), এবং উচ্চ-স্তরের ঘোষণামূলক ভাষাগুলি (এক্সএসএলটি, এক্সকিউরি, এক্সপ্যাথ)। আপনার জন্য যা সর্বোত্তম তা আপনার প্রকল্পের প্রয়োজনীয়তা এবং আপনার ব্যক্তিগত স্বাদের উপর নির্ভর করে।


2
DOM একটি ডাব্লু 3 সি স্ট্যান্ডার্ড ( w3.org/DOM )। এই মানটির জাভা বাস্তবায়ন JAXP মান ( jcp.org/en/jsr/detail?id=206 ) দ্বারা আচ্ছাদিত । জ্যাকএক্সপি এর পরে বিভিন্ন সরবরাহকারী যেমন: ওরাকল, অ্যাপাচি ইত্যাদি দ্বারা প্রয়োগ করা হয়
বিডাউন

প্রকৃতপক্ষে, কেউই ডোমকে মোটেই ব্যবহার করবে না যদি তা না থাকে (ক) এটি একটি মান হিসাবে সংজ্ঞায়িত হয়েছিল এবং এর একাধিক বাস্তবায়ন রয়েছে, এবং (খ) এটি জেডিকে ডিফল্টরূপে অন্তর্ভুক্ত করেছে। অন্যান্য সমস্ত দৃষ্টিকোণ থেকে, JDOM2 এবং XOM অনেক বেশি পছন্দনীয়।
মাইকেল কে

4

নিকিতার বক্তব্যটি একটি চমৎকার: খারাপের সাথে পরিপক্কদের বিভ্রান্ত করবেন না। এক্সএমএল খুব বেশি পরিবর্তন হয়নি।

জেডোম DOM4J এর অন্য বিকল্প হবে alternative


আপনি কোনটি বেছে নেবেন এবং কেন?
প্রেমরাজ

1
এটা আসলে খুব একটা ব্যাপার না। উভয়ই স্যাক্স এবং জেদকে অন্তর্নির্মিত ডোম পার্সারের মোড়ক। ডাব্লু 3 সি ডকুমেন্ট হায়ারার্কি ভার্ভোজ এবং ব্যবহার করা শক্ত, তাই DOM4J এবং JDOM উভয়ই এটিকে সহজ করার চেষ্টা করে। আমি এলিয়ট রাস্টি হ্যারল্ড পছন্দ করি, তাই আমি প্রথমে জেডিএম পৌঁছানোর প্রবণতা রাখি।
duffymo

4

জাভাতে এক্সএমএল পার্স করার জন্য আপনার কোনও বাহ্যিক গ্রন্থাগার প্রয়োজন নেই। জাভা বহু বছর ধরে SAX এবং DOM এর অন্তর্নির্মিত বাস্তবায়ন নিয়ে এসেছে।


3

জেডিএম ব্যবহারে আগ্রহী লোকেরা, তবে ভয়ে যে কিছুক্ষণের মধ্যে আপডেট হয়নি (বিশেষত জাভা জেনেরিকসকে কাজে লাগানো নয়), কফিডোম নামে একটি কাঁটা রয়েছে যা এই দিকগুলিকে ঠিকভাবে সম্বোধন করে এবং জেডিএম এপিআইকে আধুনিকীকরণ করেছে, এখানে আরও পড়ুন:

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
একটি সতর্কতা: ভিটিডি-এক্সএমএল এটি জিপিএল এর অধীনে অনুমোদিত, যা পেশাদার বা বাণিজ্যিক বিকাশের বেশিরভাগ অংশেই কার্যকর কার্যকর হয়। ইঞ্জিনিয়ারদের বিশ্লেষণের জন্য তাদের নিজস্ব অ্যাটর্নির সাথে পরামর্শ করা উচিত, তবে যদি আপনাকে ইঞ্জিনিয়ারিং করার জন্য অর্থ প্রদান করা হয় তবে আপনি সম্ভবত খুঁজে পেতে পারেন যে আপনার সংস্থা জিপিএলের অধীন লাইসেন্স প্রাপ্ত কোনও লাইব্রেরি ব্যবহারের অনুমতি দেয় না (এবং করতে পারে না)।
সারা জি

এই লিঙ্কটি মারা গেছে
নাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.