2012-04-05 14 views
20

मैं पार्स करने और XML response करने की कोशिश कर रहा हूं, लेकिन मैं बुरी तरह विफल रहा हूं। मैंने शुरुआत में सोचा था कि xml प्रतिक्रिया में वापस नहीं किया जा रहा था, इसलिए मैंने नीचे दिए गए कोड को मेरे xml फ़ाइल के सीधे लिंक के साथ तैयार किया। मैं बिना किसी समस्या के स्क्रीन पर XML प्रिंट करने में सक्षम हूं। हालांकि जब मैं अपनी पार्स विधि को कॉल करता हूं तो मुझे फ़ाइल का समयपूर्व अंत मिलता है।मुझे यह त्रुटि क्यों मिल रही है फ़ाइल का समयपूर्व अंत?

यह काम करता है अगर मैं सीधे यूआरएल पारित:

  • builder.parse ("");

लेकिन विफल रहता है जब मैं एक InputStream पारित कर दिया:

  • builder.parse (connection.getInputStream());

    try { 
        URL url = new URL(xml); 
        URLConnection uc = url.openConnection(); 
        HttpURLConnection connection = (HttpURLConnection)uc; 
    
        connection.setDoInput(true); 
        connection.setDoOutput(true); 
    
        InputStream instream; 
        InputSource source; 
        //get XML from InputStream 
        if(connection.getResponseCode()>= 200){ 
         connection.connect();  
         instream = connection.getInputStream();   
         parseDoc(instream);  
        } 
        else{ 
         instream = connection.getErrorStream(); 
        } 
    
    
    } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
    } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
    } catch (ParserConfigurationException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
    } catch (SAXException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
    } 
    
    
    
    static void parseDoc(InputStream instream) throws ParserConfigurationException, 
    SAXException, IOException{ 
    
    
        BufferedReader buff_read = new BufferedReader(new InputStreamReader(instream,"UTF-8")); 
        String inputLine = null; 
    
        while((inputLine = buff_read.readLine())!= null){ 
         System.out.println(inputLine); 
        } 
    
        DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance(); 
        factory.isIgnoringElementContentWhitespace(); 
        DocumentBuilder builder = factory.newDocumentBuilder(); 
        Document doc = builder.parse(instream); 
    } 
    

त्रुटियों मैं हो रही है:

[Fatal Error] :1:1: Premature end of file. 
org.xml.sax.SAXParseException: Premature end of file. 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source) 
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source) 
    at com.ameba.api.network.MainApp.parseDoc(MainApp.java:78) 
    at com.ameba.api.network.MainApp.main(MainApp.java:41) 
+0

क्या आपके पास XML फ़ाइल है जिसे आप पार्स करने का प्रयास कर रहे हैं। फ़ाइल का समयपूर्व अंत इंगित करता है कि आपकी एक्सएमएल फ़ाइल पूरी नहीं हुई है, क्योंकि आप यहां यूआरएल कनेक्शन का उपयोग कर रहे हैं, मुझे नेटवर्क के मुद्दों पर संदेह है। इस समस्या को हल करने का सबसे अच्छा तरीका है वायरसहार्क या टीसीपी मॉनीटर प्रकार के उपकरण का उपयोग करके इस एक्सएमएल फ़ाइल को कैप्चर करना और फिर यह जांचना है कि यह – NiranjanBhat

+0

@ निरंजनबैट है। हां एक्सएमएल पूर्ण और मान्य है। मैंने इस एक्सएमएल को सीधे लिंक के साथ पार्स किया है। ऐसा लगता है कि एक इनपुटस्ट्रीम का उपयोग करते समय केवल त्रुटि उत्पन्न होती है। – Fabii

+0

आप पोस्ट क्यों कर रहे हैं लेकिन कोई डेटा नहीं भेज रहे हैं? – EJP

उत्तर

25

जब आप ऐसा करते,

while((inputLine = buff_read.readLine())!= null){ 
     System.out.println(inputLine); 
    } 

आप धारा में सब कुछ उपभोग करते हैं, तो धारा में खाली है। अब जब ऐसा करने का प्रयास करें,

Document doc = builder.parse(instream); 

पार्सिंग विफल हो जाएगी, क्योंकि आपने इसे खाली स्ट्रीम पारित कर दिया है।

+0

मैंने readLine() कथन हटा दिया। लेकिन मुझे अभी भी एक ही त्रुटि मिल रही है। अगर मैं एक्सएमएल के लिए सीधा लिंक प्रदान करता हूं तो यह काम करता है। अगर मैं कनेक्शन का उपयोग कर प्रक्रिया करने की कोशिश करता हूं .getInputStream() अगर उस त्रुटि को फेंकता है। – Fabii

+0

स्ट्रीम के साथ एक मुद्दा भी था जो वापस आ रहा था। समस्या सुलझ गयी। – Fabii

+2

@Fabii स्ट्रीम वापस आने के साथ क्या समस्या थी? मैं जानना चाहता हूं क्योंकि मुझे एक ही समस्या मिल रही है। – NobleUplift

0

मैं एक ही त्रुटि के पार आया, और आसानी से अपवाद प्रवेश करके समस्या थी मिल सकता है:

documentBuilder.setErrorHandler(new ErrorHandler() { 
    @Override 
    public void warning(SAXParseException exception) throws SAXException { 
     log.warn(exception.getMessage()); 
    } 

    @Override 
    public void fatalError(SAXParseException exception) throws SAXException { 
     log.error("Fatal error ", exception); 
    } 

    @Override 
    public void error(SAXParseException exception) throws SAXException { 
     log.error("Exception ", exception); 
    } 
}); 

या, बजाय त्रुटि लॉग इन करने के लिए, आप यह कर सकते हैं और throwcatch यह है जहाँ आप को संभालने प्रविष्टियां, ताकि आप त्रुटि पर बेहतर संकेत प्राप्त करने के लिए प्रविष्टि को स्वयं प्रिंट कर सकें।

1

आपको त्रुटि मिल रही है क्योंकि SAXBuilder "रिक्त राज्यों" से निपटने के लिए पर्याप्त बुद्धिमान नहीं है। तो यह कम से कम <xml ..> घोषणा की तलाश करता है, और जब कोई डेटा प्रतिक्रिया नहीं देता है तो यह रिक्त स्थिति की रिपोर्ट करने के बजाय आप जो अपवाद देखते हैं उसे बनाता है।

2

जो लोग उत्तर के लिए इस पोस्ट में पहुँच के लिए:

यह मुख्य रूप से होता है क्योंकि InputStream डोम पार्सर लेने वाली है खाली

तो मैं क्या भर में भाग गया है, हो सकता है दो स्थितियों है:

  1. InputStream आप पार्सर में पास हुए हैं और इस प्रकार खाली हो गए हैं।
  2. File या जो भी आपने InputStream बनाया है, वह एक खाली फ़ाइल या स्ट्रिंग या जो भी हो सकता है। खालीपन कारण कारण हो सकता है समस्या। इसलिए आपको InputStream का स्रोत देखना होगा।
संबंधित मुद्दे