2012-04-05 67 views
20

Estoy tratando de analizar y XML response, pero estoy fallando miserablemente. Inicialmente pensé que el xml simplemente no se devolvía en la respuesta, así que diseñé el siguiente código con un enlace directo a mi archivo xml en línea. Puedo imprimir el XML en la pantalla sin problemas. Sin embargo, cuando llamo a mi método de análisis, obtengo fin de archivo prematuro.¿Por qué recibo este error Fin de archivo prematuro?

Funciona si paso la URL directamente:

  • builder.parse ("");

pero falla cuando pasé 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); 
    } 
    

Los errores que estoy recibiendo:

[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

Tiene el archivo XML que intenta analizar. El final prematuro del archivo indica que su archivo XML no se completó, ya que aquí está usando la conexión URL, sospecho que hay problemas de red. La mejor manera de resolver este problema es capturar este archivo XML utilizando wireshark o el tipo de herramientas de monitor TCP y luego verificar si está completo – NiranjanBhat

+0

@NiranjanBhat. Sí, el XMl está completo y es válido. He analizado este xml con un enlace directo. Parece que el error solo surge cuando se usa un InputStream. – Fabii

+0

¿Por qué estás haciendo una POST pero no envías datos? – EJP

Respuesta

25

Al hacer esto,

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

se consumen en todo dentro de la corriente, por lo que dentro de la corriente está vacía. Ahora cuando intente hacer esto,

Document doc = builder.parse(instream); 

El análisis fallará, porque lo ha pasado una secuencia vacía.

+0

Quité la instrucción readLine(). Pero sigo recibiendo el mismo error. Si proporciono el enlace directo al xml, funciona. Si trato de procesar utilizando connection.getInputStream() si arroja ese error. – Fabii

+0

También hubo un problema con la transmisión que se estaba devolviendo. Problema resuelto. – Fabii

+2

@Fabii ¿Cuál fue el problema con la transmisión de flujo? Quiero saber porque estoy teniendo el mismo problema. – NobleUplift

0

me encontré con el mismo error, y puede fácilmente encontrar cuál era el problema por el registro de la excepción:

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, en lugar de la tala de error, puede throw y catch que en el que maneje la entradas, por lo que puede imprimir la entrada en sí para obtener una mejor indicación del error.

1

Está recibiendo el error porque SAXBuilder no es lo suficientemente inteligente como para tratar con "estados en blanco". Por lo tanto, busca al menos una declaración <xml ..>, y cuando eso provoca una respuesta sin datos, crea la excepción que ve en lugar de informar el estado vacío.

2

Para aquellos que alcanza este puesto de respuesta:

Esto sucede principalmente porque el InputStream el analizador DOM está consumiendo está vacía

Así que en lo que me encontré, puede haber dos situaciones:

  1. El InputStream que pasó al analizador se ha utilizado y, por lo tanto, se ha vaciado.
  2. El File o lo que sea que haya creado el InputStream de puede ser un archivo o una cadena vacía o lo que sea. El vacío podría ser la causa del problema. Por lo tanto, debe verificar su fuente del InputStream.
Cuestiones relacionadas