2010-11-23 16 views
6

के जावा (JAXP) XML पार्सिंग मतभेद वहाँDocumentBuilder

  1. DocumentBuilder.parse(InputStream) और
  2. DocumentBuilder.parse(InputSource) के बीच अंतर के किसी भी प्रकार है?

मुझे केवल यह पता चल सकता है कि पहले मामले के लिए, पार्सर स्ट्रीम से एन्कोडिंग का पता लगाता है, इसलिए यह सुरक्षित है जबकि बाद में मुझे यकीन नहीं है कि यह एन्कोडिंग सेट करने की आवश्यकता है या नहीं।

कोई अन्य बिंदु (उदा। प्रदर्शन) मुझे अवगत होना चाहिए?

उत्तर

3

मुख्य अंतर यह है कि पहला आपको InputStream इंटरफ़ेस के कार्यान्वयन के आधार पर केवल बाइनरी स्रोतों से आपकी XML सामग्री को पढ़ने की अनुमति देता है। अर्थात्: एक फ़ाइल से सीधे (Socket.getInputStream() से) एक खुले सॉकेट (एक FileInputStream का प्रयोग करके), आदि

दूसरा एक, DocumentBuilder.parse(InputSource), आप द्विआधारी स्रोतों भी से डेटा (यह, है एक InputStream impl) को पढ़ने के लिए अनुमति देता है और चरित्र स्रोतों से (Reader कार्यान्वयन)। तो, इस के साथ आप एक एक्सएमएल स्ट्रिंग का उपयोग कर सकते हैं (StringReader का उपयोग करके), या BufferedReader

दूसरी विधि के साथ आपको पहले से ही InputStreams को संभालने का मौका मिला है, पहला एक शॉर्टकट है, इसलिए जब आपके पास InputStream है तो आपको एक नया InputSource बनाने की आवश्यकता नहीं है। वास्तव में, InputStream विधि का स्रोत कोड है:

public Document parse(InputStream is) 
    throws SAXException, IOException { 
    if (is == null) { 
     throw new IllegalArgumentException("InputStream cannot be null"); 
    } 

    InputSource in = new InputSource(is); 
    return parse(in); 
} 
+0

मैंने अपनी पोस्ट को सही किया है। आप लिख रहे हैं, मेरा मतलब इनपुट स्रोत था। मेरे पास पहले से स्ट्रिंग में एक वैध XML स्ट्रिंग है, और मैं यह तय नहीं कर सका कि कौन सा दृष्टिकोण बेहतर है, यानी इसे इनपुटस्ट्रीम या इनपुट स्रोत में परिवर्तित करें। मैंने http://www.ibm.com/developerworks/xml/library/x-tipsaxis.html में पढ़ा है कि इनपुटस्ट्रीम के साथ, चरित्र एन्कोडिंग स्वयं स्ट्रीम से पता चला है, जबकि इनपुट स्रोत के साथ, आपको इसे सेट करना चाहिए और वह अगर एन्कोडिंग सेट वास्तव में स्ट्रिंग में उपयोग किया गया एन्कोडिंग नहीं है, तो मैं विश्लेषण कर रहा हूं, और मैं सोच रहा था कि अतिरिक्त सूक्ष्मताएं हैं, मुझे अवगत होना चाहिए – Cratylus

+0

आपके मामले में, मैं इनपुट स्रोत का उपयोग करूंगा, क्योंकि आपके पास पहले से एक्सएमएल है स्ट्रिंग serialized। एन्कोडिंग सेट करने के लिए, मैं इनपुट स्रोत के "setEncoding" विधि का उपयोग करूंगा। –

+0

अजीब। आपके द्वारा स्रोत कोड के रूप में पोस्ट किया गया कोड एन्कोडिंग के बारे में लेख (मेरी पिछली टिप्पणी से) के अनुरूप नहीं है। क्योंकि अगर यह पार्स (इनपुट) का कार्यान्वयन है तो लेख में उल्लिखित एन्कोडिंग कार्यक्षमता के बारे में गलत है। या मुझे कुछ याद आ रहा है? – Cratylus