the template prematuro premature org not msloadmap error end content archivo allowed java xml xml-parsing

java - template - org.xml.sax.SAXParseException: fin de archivo prematuro para*VALID*XML



org xml sax saxparseexception content is not allowed in prolog (7)

Me estoy poniendo muy extraño "Fin de archivo prematuro". excepción para los últimos días en uno de nuestros servidores. El mismo XML de configuración funciona bien en otro servidor. Estamos utilizando Tomcat 5.0.28 en ambos servidores. Este código ha estado funcionando para las edades (más de 7 años), solo después de una caída reciente del servidor, enfrentamos este problema en uno de los servidores. No hay cambios en XML así como en el código de análisis de Java. :(

La única diferencia que puedo ver es en las versiones de Java:

Problema Server java versión "1.6.0_16" Java (TM) SE Runtime Environment (compilación 1.6.0_16-b01) Java HotSpot (TM) 64-Bit Server VM (compilación 14.2-b01, modo mixto)

Versión java del servidor de trabajo "1.6.0_07" Java (TM) SE Runtime Environment (compilación 1.6.0_07-b06) Java HotSpot (TM) 64-Bit Server VM (compilación 10.0-b23, modo mixto)

Aquí está el código de Java que ha estado funcionando durante varios años:

private void readSource(final InputSource in ) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(in); Element elt = doc.getDocumentElement(); this.readElement( elt ); } catch ( Exception ex ) { ex.printStackTrace(); throw new ConfigurationException( "Unable to parse configuration information", ex ); } }

Y aquí está la excepción.

[Fatal Error] :-1:-1: Premature end of file. org.xml.sax.SAXParseException: Premature end of file. at org.apache.xerces.parsers.DOMParser.parse(Unknown Source) at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source) at com.circus.core.Configuration.readSource(Configuration.java:706)

Ya he intentado validar XML y no encontré errores allí. ¿Alguna idea de dónde más puedo buscar un posible problema?

¡Cualquier apuntador sería muy apreciado!

TIA, - Manish


¿Estás seguro de que el archivo XML tiene la codificación de caracteres correcta? FileReader siempre usa la codificación predeterminada de la plataforma, por lo que si el servidor "en funcionamiento" tenía una codificación predeterminada de (digamos) ISO-8859-1 y el servidor "problemático" usa UTF-8 vería este error si el XML contiene alguna no- Caracteres ASCII

¿Funciona si crea el InputSource desde un FileInputStream en lugar de un FileReader?


En nuestro caso, era un AndroidManifest.xml vacío.

Al actualizar Eclispe nos encontramos con el problema habitual , y AndroidManifest.xml debe haber sido registrado en SVN por el script de construcción después de ser criticado.

Lo encontré compilando desde dentro de Eclipse, en lugar de hacerlo desde la línea de comandos.


Es un problema con Java InputStream. Cuando se lee la secuencia una vez que el contador de posición de desplazamiento de archivo se mueve al final del archivo. En la lectura posterior utilizando la misma secuencia, obtendrá este error. Por lo tanto, debe cerrar y volver a abrir la secuencia de nuevo o llamar a inputStream.reset() para restablecer el contador de compensación a su posición inicial.


Esta excepción solo ocurre si está analizando una matriz vacía de bytes String / empty.

a continuación hay un fragmento sobre cómo reproducirlo:

String xml = ""; // <-- deliberately an empty string. ByteArrayInputStream xmlStream = new java.io.ByteArrayInputStream(xml.getBytes()); Unmarshaller u = JAXBContext.newInstance(...) u.setSchema(...); u.unmarshal( xmlStream ); // <-- here it will fail


Esto está resuelto. El problema estaba en otra parte. Otro código en el trabajo cron estaba truncando XML a 0 archivo de longitud. Me he encargado de eso.


Por favor, asegúrese de no consumir su inputstream ningún lugar antes de analizar. El código de muestra es el siguiente: la propuesta a continuación es httpresponse (es decir, respuesta) y el contenido principal contiene dentro de StringEntity (ie getEntity())in form of inputStream(ie getContent()) .

InputStream rescontent = response.getEntity().getContent(); tsResponse=(TsResponse) transformer.convertFromXMLToObject(rescontent );


Si el flujo de entrada no se cierra correctamente, esta excepción puede ocurrir. asegúrese de que: si inputstream utilizado no se utiliza "Antes" de alguna manera, entonces, donde está destinado a leer. es decir, si se lee por segunda vez desde el mismo flujo de entrada en una sola operación, la segunda llamada obtendrá esta excepción. También asegúrese de cerrar el flujo de entrada en el bloque final o algo así.