मैं एक स्ट्रिंग में XML से एक org.w3c.dom.Document कैसे लोड कर सकता हूं?


103

मेरे पास एक स्ट्रिंग में एक पूर्ण XML दस्तावेज़ है और एक Documentवस्तु की तरह होगा । Google सभी प्रकार के कचरे को बदल देता है। सबसे सरल उपाय क्या है? (जावा 1.5 में)

मैट मैकमिन के लिए समाधान धन्यवाद , मैं इस कार्यान्वयन पर बस गया हूं। मेरे लिए इनपुट लचीलापन और अपवाद ग्रैन्युलैरिटी का सही स्तर है। (यह जानना अच्छा है कि क्या त्रुटि विकृत XML से आई है SAXException- या सिर्फ खराब IO - 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;
}

यह अच्छा होगा यदि आप समाधान को सही कर सकते हैं। String.getByptes और InputStream का उपयोग करने से i18n समस्याएं आती हैं। मेरे एक दोस्त को यहाँ से कोड मिला है जो कि गलत है। लकी कि फाइंडबग्स ने इस मुद्दे का पता लगाया। एरिकसन द्वारा प्रदान किया गया सही समाधान InputSource का उपयोग करना है।
केनेथ जू

जवाबों:


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()एन्कोडिंग के लिए कोई विचार नहीं करता है ।
मैकडोवेल

2
क्या आपके पास एरिकसन के जवाब का मतलब है? या शायद उसने अपना नाम बदल लिया है?
रोजरपैक 20

1
क्या कास्टिंग नहीं होनी चाहिए return (Document) builder.parse(new ByteArrayInputStream(xml.getBytes()));??
शिशुप्रधान अरविंद '

150

वाह वहाँ!

इस कोड के साथ एक संभावित गंभीर समस्या है, क्योंकि यह निर्दिष्ट वर्ण एन्कोडिंग को अनदेखा करता है String(जो कि डिफ़ॉल्ट रूप से UTF-8 है)। जब आप String.getBytes()प्लेटफ़ॉर्म डिफ़ॉल्ट कॉलिंग का उपयोग यूनिकोड वर्णों को बाइट्स को एन्कोड करने के लिए किया जाता है। तो, पार्सर सोच सकता है कि यह UTF-8 डेटा प्राप्त कर रहा है जब वास्तव में यह EBCDIC या कुछ हो रहा है ... बहुत सुंदर नहीं है!

इसके बजाय, एक इनपुट स्रोत का उपयोग करने वाले पार्स विधि का उपयोग करें, जिसका निर्माण रीडर के साथ किया जा सकता है, जैसे:

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

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

यह एक बड़ी बात की तरह नहीं लग सकता है, लेकिन चरित्र एन्कोडिंग मुद्दों की अज्ञानता कपटपूर्ण सड़ांध के कारण y2k तक ले जाती है।


3
इतना सरल लेकिन इतना Google पर एक समाधान मायावी।
साभार

6
मुझे अब एहसास हुआ कि मुझे स्वीकृत उत्तर को कॉपी-पेस्ट नहीं करना चाहिए, बल्कि इसके माध्यम से पढ़ना चाहिए।
विटाली सज़ानोविच

1
बहुत बढ़िया! सेटअप file.encoding = निम्नलिखित के साथ JDK8 पर हमारी जान बचाई आईएसओ 8859_1, javax.servlet.request.encoding = UTF-8 पुनश्च जवाब हमारे लिए सही फ्लॉप काम के रूप में लेबल
kosta5

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

जावा में XML को हेरफेर करने के लिए, मैं हमेशा ट्रांसफॉर्मर एपीआई का उपयोग करता हूं:

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();
}   
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.