2012-04-05 26 views
20

Sto cercando di analizzare e XML response, ma sto fallendo miseramente. Inizialmente ho pensato che non fosse stato restituito nella risposta, xml, quindi ho creato il codice sottostante con un collegamento diretto al mio file xml online. Sono in grado di stampare lo XML sullo schermo senza problemi. Tuttavia quando chiamo il mio metodo di analisi ottengo Fine prematura del file.Perché ottengo questo errore Fine prematura del file?

Funziona se mi passate l'URL direttamente:

  • builder.parse ("");

ma fallisce quando ho passato un 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); 
    } 
    

Gli errori che sto ottenendo:

[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

Avete il file XML che si sta tentando di analizzare. La fine prematura del file indica che il tuo file XML non era completo, dal momento che stai usando la connessione URL qui, ho il sospetto che ci siano problemi di rete. Il modo migliore per risolvere questo problema è quello di acquisire questo file XML utilizzando il tipo di strumenti wireshark o Monitor TCP e quindi verificare se è completo – NiranjanBhat

+0

@NiranjanBhat. Sì, XMl è completo e valido. Ho analizzato questo xml con un collegamento diretto. Sembra che l'errore si verifichi solo quando si utilizza un InputStream. – Fabii

+0

Perché stai facendo un POST ma non invii dati? – EJP

risposta

25

Quando si esegue questa operazione,

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

si consumano tutto in InStream, in modo da InStream è vuota. Ora, quando provare a fare questo,

Document doc = builder.parse(instream); 

L'analisi fallirà, perché avete passato è un flusso vuoto.

+0

Ho rimosso l'istruzione readLine(). Ma sto ancora ricevendo lo stesso errore. Se fornisco il collegamento diretto al xml funziona. Se provo a elaborare utilizzando connection.getInputStream() se genera quell'errore. – Fabii

+0

C'era anche un problema con lo stream che stava tornando. Problema risolto. – Fabii

+2

@Fabii Qual è stato il problema con il flusso restituito? Voglio sapere perché sto ricevendo lo stesso problema. – NobleUplift

0

mi sono imbattuto lo stesso errore, e potrebbe facilmente trovare quello che era il problema accedendo eccezione:

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

O, invece di registrare l'errore, è possibile throw e catch esso in cui si gestisce il voci, in modo da poter stampare la voce stessa per ottenere una migliore indicazione sull'errore.

1

Si riceve l'errore perché SAXBuilder non è abbastanza intelligente da gestire gli "stati vuoti". Quindi cerca almeno una dichiarazione <xml ..> e quando ciò causa una mancata risposta ai dati, crea l'eccezione che si vede invece di segnalare lo stato vuoto.

2

Per coloro che hanno raggiunto questo post per Risposta:

Questo accade soprattutto perché il InputStream il parser DOM sta consumando è vuota

Quindi, in che cosa mi sono imbattuto in, ci potrebbero essere due situazioni:

  1. Il InputStream passato al parser è stato utilizzato e quindi svuotato.
  2. File o qualsiasi altra cosa creata da InputStream potrebbe essere un file vuoto o una stringa o qualsiasi altra cosa. Il vuoto potrebbe essere la causa del problema. Quindi è necessario controllare la fonte dello InputStream.
Problemi correlati