এক্সএমএল থেকে একটি স্ট্রিংয়ে আমি কীভাবে একটি org.w3c.dom. ডকুমেন্ট লোড করব?


103

আমার কাছে একটি স্ট্রিংয়ে একটি সম্পূর্ণ এক্সএমএল ডকুমেন্ট রয়েছে এবং একটি Documentবিষয় চাই । গুগল সব ধরণের আবর্জনা সরিয়ে দেয়। সহজ সমাধান কী? (জাভা 1.5.৫ এ)

সমাধান ম্যাট ম্যাকমিনকে ধন্যবাদ , আমি এই বাস্তবায়নে স্থির হয়েছি। এটিতে আমার জন্য সঠিক স্তরের ইনপুট নমনীয়তা এবং ব্যতিক্রম গ্রানুলারিলিটি রয়েছে। (ত্রুটিটি বিকৃত XML - SAXException- বা কেবল খারাপ আইও - এর থেকে এসেছে কিনা তা জানা ভাল IOException))

public static org.w3c.dom.Document loadXMLFrom(String xml)
    throws org.xml.sax.SAXException, java.io.IOException {
    return loadXMLFrom(new java.io.ByteArrayInputStream(xml.getBytes()));
}

public static org.w3c.dom.Document loadXMLFrom(java.io.InputStream is) 
    throws org.xml.sax.SAXException, java.io.IOException {
    javax.xml.parsers.DocumentBuilderFactory factory =
        javax.xml.parsers.DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    javax.xml.parsers.DocumentBuilder builder = null;
    try {
        builder = factory.newDocumentBuilder();
    }
    catch (javax.xml.parsers.ParserConfigurationException ex) {
    }  
    org.w3c.dom.Document doc = builder.parse(is);
    is.close();
    return doc;
}

সমাধানটি সংশোধন করতে পারলে ভালো লাগবে। স্ট্রিং.জেটবাইপেটস এবং ইনপুট স্ট্রিম ব্যবহার করা আই 18 এন সমস্যাগুলি চাপিয়ে দেয়। আমার এক বন্ধু কোডটি এখান থেকে পেয়েছিল যা ভুল। ভাগ্যবান যে সন্ধানকারীরা সমস্যাটি সনাক্ত করেছে। এরিকসন দ্বারা প্রদত্ত সঠিক সমাধানটি ইনপুটসোর্স ব্যবহার করা use
কেনেথ জু

উত্তর:


80

এটি জাভা 1.5 তে আমার জন্য কাজ করে - আমি পঠনযোগ্যতার জন্য নির্দিষ্ট ব্যতিক্রমগুলি এড়িয়ে গিয়েছি।

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;

public Document loadXMLFromString(String xml) throws Exception
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();

    return builder.parse(new ByteArrayInputStream(xml.getBytes()));
}

28
সিলভার্কিংয়ের উত্তরে উল্লিখিত হিসাবে, এই কোডটি getBytes()এনকোডিংয়ের জন্য কোনও বিবেচনা ছাড়াই ব্যবহার করে।
ম্যাকডোয়েল 11

2
আপনি কি এরিকসনের উত্তর বোঝাতে চাইছেন? নাকি তিনি নিজের প্রোফাইলের নাম পরিবর্তন করেছেন?
রজারডপ্যাক

1
কাস্টিং করা উচিত হবে না return (Document) builder.parse(new ByteArrayInputStream(xml.getBytes()));??
ইনফ্যান্টপ্রো'আরবিন্দ

150

ওহে!

এই কোডটিতে একটি সম্ভাব্য গুরুতর সমস্যা রয়েছে, কারণ এটি বর্ণিত এনক্রোডিং String(যা ইউটিএফ -8 ডিফল্টরূপে) এ বর্ণিত রয়েছে তা উপেক্ষা করে । আপনি যখন String.getBytes()প্ল্যাটফর্মটি কল করবেন তখন ডিফল্ট এনকোডিংটি ইউনিকোড অক্ষরগুলি বাইটে এনকোড করতে ব্যবহৃত হয়। সুতরাং, পার্সারটি ভাবতে পারে এটি ইউটিএফ -8 ডেটা পাচ্ছে যখন বাস্তবে এটি ইবিসিডিক বা কিছু পাওয়া যাচ্ছে ... সুন্দর নয়!

পরিবর্তে, কোনও ইনপুটসোর্স লাগে এমন পার্স পদ্ধতিটি ব্যবহার করুন, যা এই জাতীয় পাঠকের সাথে তৈরি করা যায়:

import java.io.StringReader;
import org.xml.sax.InputSource;

        return builder.parse(new InputSource(new StringReader(xml)));

এটি কোনও বড় ব্যাপার বলে মনে হচ্ছে না, তবে চরিত্রের এনকোডিংয়ের বিষয়গুলি সম্পর্কে অজ্ঞতা কুখ্যাত কোড পচা y2k এর মতো করে।


3
গুগল এ এত সহজ কিন্তু এতটা অধরা একটি সমাধান। ধন্যবাদ +1
pat8719

6
আমি এখন বুঝতে পেরেছি যে আমি কেবল গৃহীত উত্তরটি অনুলিপি করতে পারি না বরং তার মাধ্যমে পড়তে পারি।
ভাইটালি সাজানোভিচ

1
অসাধারণ! নিম্নলিখিত সেটআপ ফাইল.ইনকোডিং = আইএসও -8859_1, javax.servlet.request.encoding = ইউটিএফ -8 পিএস সহ জেডিকে 8 এ আমাদের জীবন বাঁচিয়েছে উত্তরটি আমাদের জন্য সঠিক কাজ হিসাবে লেবেলযুক্ত উত্তর নেই
কোস্টা 5

9

ঠিক একটি অনুরূপ সমস্যা ছিল, আমার নোডলিস্ট দরকার ছিল এবং ডকুমেন্টের প্রয়োজন ছিল না, আমি এখানে যা এলাম তা এখানে। এটি বেশিরভাগ আগের মতই সমাধান, মূল উপাদানটি নোডলিস্ট হিসাবে নামিয়ে আনার জন্য এবং চরিত্রের এনকোডিংয়ের পরিবর্তে ইনপুটসোর্সটি ব্যবহার করার জন্য এরিকসনের পরামর্শ ব্যবহার করে বাড়ানো হয়।

private String DOC_ROOT="root";
String xml=getXmlString();
Document xmlDoc=loadXMLFrom(xml);
Element template=xmlDoc.getDocumentElement();
NodeList nodes=xmlDoc.getElementsByTagName(DOC_ROOT);

public static Document loadXMLFrom(String xml) throws Exception {
        InputSource is= new InputSource(new StringReader(xml));
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = null;
        builder = factory.newDocumentBuilder();
        Document doc = builder.parse(is);
        return doc;
    }

1

জাভাতে এক্সএমএলকে পরিচালনা করার জন্য, আমি সর্বদা ট্রান্সফর্মার এপিআই ব্যবহার করার ঝোঁক রাখি:

import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamSource;

public static Document loadXMLFrom(String xml) throws TransformerException {
    Source source = new StreamSource(new StringReader(xml));
    DOMResult result = new DOMResult();
    TransformerFactory.newInstance().newTransformer().transform(source , result);
    return (Document) result.getNode();
}   
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.