org.xml.sax.SAXParseException: el contenido no está permitido en prolog

Tengo un cliente de servicio web basado en Java conectado al servicio web Java (implementado en el marco Axis1).

Estoy siguiendo una excepción en mi archivo de registro:

Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog. at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source) at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source) at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at javax.xml.parsers.SAXParser.parse(Unknown Source) at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227) at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696) at org.apache.axis.Message.getSOAPEnvelope(Message.java:435) at org.apache.ws.axis.security.WSDoAllReceiver.invoke(WSDoAllReceiver.java:114) at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32) at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118) at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83) at org.apache.axis.client.AxisClient.invoke(AxisClient.java:198) at org.apache.axis.client.Call.invokeEngine(Call.java:2784) at org.apache.axis.client.Call.invoke(Call.java:2767) at org.apache.axis.client.Call.invoke(Call.java:2443) at org.apache.axis.client.Call.invoke(Call.java:2366) at org.apache.axis.client.Call.invoke(Call.java:1812) 

Esto a menudo es causado por un espacio en blanco antes de la statement XML, pero podría ser cualquier texto , como un guión o cualquier carácter. Digo a menudo causado por el espacio en blanco porque las personas suponen que el espacio en blanco siempre es ignorable, pero ese no es el caso aquí.


Otra cosa que sucede a menudo es una BOM UTF-8 (marca de orden de bytes), que se permite antes de que la statement XML se pueda tratar como espacios en blanco si el documento se entrega como una secuencia de caracteres a un analizador XML en lugar de una secuencia de bytes .

Lo mismo puede suceder si los archivos de esquema (.xsd) se usan para validar el archivo xml y uno de los archivos de esquema tiene una lista de materiales UTF-8 .

Intente agregar un espacio entre la cadena de encoding="UTF-8" en el prólogo y la terminación ?> . En XML, el prólogo designa este elemento delimitado por signo de interrogación al comienzo del documento (mientras que el prólogo de etiqueta en stackoverflow se refiere al lenguaje de progtwigción).

Agregado: ¿Es ese dash en frente de su prólogo parte del documento? Ese sería el error allí, teniendo datos en frente del prólogo, - .

En realidad, además del comentario de Yuriy Zubarev

Cuando pasa un archivo xml inexistente al analizador. Por ejemplo, pasas

 new File("C:/temp/abc") 

cuando solo existe el archivo C: /temp/abc.xml en su sistema de archivos

En cualquier caso

 builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); document = builder.parse(new File("C:/temp/abc")); 

o

 DOMParser parser = new DOMParser(); parser.parse("file:C:/temp/abc"); 

Todos dan el mismo mensaje de error.

Muy decepcionante error, porque el siguiente rastro

 javax.servlet.ServletException at org.apache.xerces.parsers.DOMParser.parse(Unknown Source) ... Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog. ... 40 more 

no dice nada sobre el hecho de que ‘el nombre del archivo es incorrecto’ o ‘dicho archivo no existe’. En mi caso, tenía un archivo xml absolutamente correcto y tuve que pasar 2 días para determinar el problema real.

Significa que XML está mal formado o que el cuerpo de la respuesta no es un documento XML en absoluto.

Tuve el mismo problema (y lo resolví) al intentar analizar un documento XML con freemarker.

No tenía espacios antes del encabezado del archivo XML.

El problema ocurre cuando y solo cuando la encoding del archivo y el atributo de encoding XML son diferentes. (por ejemplo: archivo UTF-8 con atributo UTF-16 en el encabezado).

Entonces tuve dos formas de resolver el problema:

  1. cambiando la encoding del archivo en sí
  2. cambiando el encabezado UTF-16 a UTF-8

Acabo de pasar 4 horas rastreando un problema similar en un WSDL. Resulta que el WSDL utilizó un XSD que importa otro espacio de nombres XSD. Este XSD importado contenía lo siguiente:

     <.... 

¡Observe el elemento de include vacío! Esta fue la raíz de mis problemas. Supongo que esta es una variación del problema de archivo de Egor no encontrado arriba.

+1 a informe de error decepcionante.

En mi caso, eliminar el atributo ‘encoding = “UTF-8″‘ funcionó por completo.

Parece un problema de encoding de conjunto de caracteres, tal vez porque tu archivo no está realmente en UTF-8.

Mi respuesta probablemente no te ayudaría, pero generalmente ayuda con este problema.

Cuando veas este tipo de excepción, deberías tratar de abrir tu archivo xml en cualquier editor hexadecimal y en algún momento puedes ver bytes adicionales al principio del archivo, que el editor de texto no muestra.

Eliminarlos y su xml será analizado.

Si todo lo demás falla, abra el archivo en formato binario para asegurarse de que no haya caracteres divertidos [3 caracteres no imprimibles al principio del archivo que identifican el archivo como utf-8] al comienzo del archivo. Hicimos esto y encontramos algunos. así que convertimos el archivo de utf-8 a ascii y funcionó.

Para los mismos problemas, he eliminado la siguiente línea,

  File file = new File("c:\\file.xml"); InputStream inputStream= new FileInputStream(file); Reader reader = new InputStreamReader(inputStream,"UTF-8"); InputSource is = new InputSource(reader); is.setEncoding("UTF-8"); 

Está funcionando bien. No estoy seguro de por qué ese UTF-8 da problemas. Para mantenerme en estado de shock, funciona bien para UTF-8 también.

Estoy usando Windows-7 32 bit y Netbeans IDE con Java * jdk1.6.0_13 *. No tengo idea de cómo funciona.

Como Mike Sokolov ya lo ha señalado, una de las posibles razones es la presencia de algunos personajes (como un espacio en blanco) antes de la etiqueta.

Si su XML de entrada se lee como String (a diferencia de la matriz de bytes), puede reemplazar su cadena de entrada con el siguiente código para asegurarse de que todos los caracteres “innecesarios” antes de eliminar la etiqueta xml se borren.

 inputXML=inputXML.substring(inputXML.indexOf(" 

Sin embargo, debe asegurarse de que el xml de entrada comience con la etiqueta xml.

Seguí las instrucciones que se encuentran aquí y obtuve el mismo error.

Intenté varias cosas para resolverlo (es decir, cambiar la encoding, escribir el archivo XML en lugar de copiarlo, pegarlo, etc.) en el Bloc de notas y en el Bloc de notas XML, pero no funcionó.

El problema se resolvió cuando edité y guardé mi archivo XML en Notepad ++ (encoding -> utf-8 sin BOM)

Para todos aquellos que reciben este error: ADVERTENCIA: Catalina.start usando conf / server.xml: El contenido no está permitido en prolog.

No es muy informativo … pero lo que esto realmente significa es que hay basura en su archivo conf / server.xml.

He visto este error exacto en otros archivos XML … este error puede deberse a cambios realizados con un editor de texto que introduce la basura.

La forma en que puede verificar si tiene basura en el archivo es abrirla con un “Editor HEX”. Si ve algún carácter antes de esta cadena

  "" 

como esto sería basura

  "‰ŠŒ" 

ese es su problema … La solución es usar un buen editor HEX … uno que le permita guardar archivos con diferentes tipos de encoding …

Entonces solo guárdalo como UTF-8. Algunos sistemas que usan archivos XML pueden necesitar que se guarden como UTF SIN BOM, lo que significa con “SIN marca de orden de bytes”

Espero que esto ayude a alguien por ahí!

En mi caso, el archivo web.xml de mi aplicación tiene espacio adicional, incluso después de que eliminé, no funcionó, tuve que revertir los cambios y sus arreglos, y sí, estaba jugando con logging.properties y web.xml en mi tomcat, pero incluso después de revertir el error seguido mostrando así que esto lo solucionó)).

espacio extra

Para ser específico, intenté agregar org.apache.catalina.filters.ExpiresFilter.level = FINE stack over something algo sobre logging.properties

Solo un pensamiento adicional sobre este para el futuro. Obtener este error podría ser el caso de que uno simplemente presione la tecla de borrar u otra tecla aleatoriamente cuando tienen una ventana XML como la pantalla activa y no están prestando atención. Esto me ha pasado antes con el archivo struts.xml en mi aplicación web. Codos torpes …

También estaba obteniendo lo mismo

XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,2] Message: Reference is not allowed in prolog.

, cuando mi aplicación creaba una respuesta XML para una llamada RestFull Webservice. Al crear el formato XML String, reemplacé & lt y & gt con , luego se produjo un error y recibí la respuesta adecuada. No estoy seguro de cómo funcionó, pero funcionó.

muestra :

 String body = "" +sum +""; 

Tuve el mismo problema.

Primero descargué el archivo XML al escritorio local y conseguí Content is not allowed in prolog durante la importación del archivo al servidor del portal. Incluso visualmente el archivo se veía bien para mí, pero de alguna manera estaba dañado.

Así que volví a descargar el mismo archivo e intenté lo mismo y funcionó.

Recientemente tuvimos el mismo problema y resultó ser el caso de una URL incorrecta y, en consecuencia, una respuesta HTTP 403 estándar (que obviamente no es el XML válido que el cliente estaba buscando). Voy a compartir los detalles en caso de que alguien dentro del mismo contexto se encuentre con este problema:

Esta era una aplicación web basada en Spring en la que se configuraba un bean “JaxWsPortProxyFactoryBean” para exponer un proxy para un puerto remoto.

  

El “END_POINT_BASE_URL” es una variable de entorno configurada en “setenv.sh” de la instancia de Tomcat que aloja la aplicación web. El contenido del archivo es algo como esto:

 export END_POINT_BASE_URL="http://localhost:9001/BusinessAppServices" #export END_POINT_BASE_URL="http://localhost:8765/BusinessAppServices" 

Los desaparecidos “;” después de cada línea causó la URL mal formada y, por lo tanto, la mala respuesta. Es decir, en lugar de “BusinessAppServices / OurService? Wsdl”, la URL tenía una CR antes de “/”. “TCP / IP Monitor” fue bastante útil al solucionar el problema.

En mi caso, recibí este error porque la API que utilicé podría devolver los datos en formato XML o JSON. Cuando lo probé usando un navegador, de manera predeterminada el formato XML, pero cuando invocaba la misma llamada desde una aplicación Java, la API devolvía la respuesta formateada JSON, que naturalmente desencadenaba un error de análisis.

Incluso yo había enfrentado un problema similar. La razón era un carácter de basura al principio del archivo.

Solución: solo abra el archivo en un editor de texto (probado en texto Sublime) elimine cualquier sangría, si hay alguna en el archivo y copie y pegue todo el contenido del archivo en un nuevo archivo y guárdelo. ¡Eso es!. Cuando ejecuté el nuevo archivo, se ejecutó sin ningún error de análisis.

Tomé el código de Dineshkumar y lo modifiqué para validar mi archivo XML correctamente:

 import org.apache.log4j.Logger; public class Myclass{ private static final Logger LOGGER = Logger.getLogger(Myclass.class); /** * Validate XML file against Schemas XSD in pathEsquema directory * @param pathEsquema directory that contains XSD Schemas to validate * @param pathFileXML XML file to validate * @throws BusinessException if it throws any Exception */ public static void validarXML(String pathEsquema, String pathFileXML) throws BusinessException{ String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; String nameFileXSD = "file.xsd"; String MY_SCHEMA1 = pathEsquema+nameFileXSD); ParserErrorHandler parserErrorHandler; try{ SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA); Source [] source = { new StreamSource(new File(MY_SCHEMA1)) }; Schema schemaGrammar = schemaFactory.newSchema(source); Validator schemaValidator = schemaGrammar.newValidator(); schemaValidator.setErrorHandler( parserErrorHandler= new ParserErrorHandler()); /** validate xml instance against the grammar. */ File file = new File(pathFileXML); InputStream isS= new FileInputStream(file); Reader reader = new InputStreamReader(isS,"UTF-8"); schemaValidator.validate(new StreamSource(reader)); if(parserErrorHandler.getErrorHandler().isEmpty()&& parserErrorHandler.getFatalErrorHandler().isEmpty()){ if(!parserErrorHandler.getWarningHandler().isEmpty()){ LOGGER.info( String.format("WARNING validate XML:[%s] Descripcion:[%s]", pathFileXML,parserErrorHandler.getWarningHandler())); }else{ LOGGER.info( String.format("OK validate XML:[%s]", pathFileXML)); } }else{ throw new BusinessException( String.format("Error validate XML:[%s], FatalError:[%s], Error:[%s]", pathFileXML, parserErrorHandler.getFatalErrorHandler(), parserErrorHandler.getErrorHandler())); } } catch(SAXParseException e){ throw new BusinessException(String.format("Error validate XML:[%s], SAXParseException:[%s]", pathFileXML,e.getMessage()),e); } catch (SAXException e){ throw new BusinessException(String.format("Error validate XML:[%s], SAXException:[%s]", pathFileXML,e.getMessage()),e); } catch (IOException e) { throw new BusinessException(String.format("Error validate XML:[%s], IOException:[%s]",pathFileXML,e.getMessage()),e); } } } 

Establezca su documento para formar de esta manera:

   %children%  

A veces es el código, no el XML

El siguiente código,

 Document doc = dBuilder.parse(new InputSource(new StringReader("file.xml"))); 

también dará como resultado este error,

[Error fatal]: 1: 1: el contenido no está permitido en prolog.org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; El contenido no está permitido en el prólogo.

porque está intentando analizar el literal de la cadena, "file.xml" (no el contenido del archivo file.xml ) y fallar porque "file.xml" como una cadena no está bien formado XML.

Solución: StringReader() :

 Document doc = dBuilder.parse(new InputSource("file.xml")); 

De manera similar, los problemas de almacenamiento sucio pueden dejar residuos residuales por delante del XML real. Si ha revisado cuidadosamente su XML y sigue obteniendo este error, registre los contenidos exactos que se pasan al analizador; a veces lo que se está analizando (tratando de ser) es sorprendente.

Tuve el mismo problema con la spring

MarshallingMessageConverter

y por código de preprocesamiento.

Mayby alguien necesitará razón: BytesMessage #readBytes – leyendo bytes … y olvidé que leer es una operación de dirección. No puedes leer dos veces.

Pruebe con BOMInputStream en apache.commons.io:

 public static  T getContent(Class instance, SchemaType schemaType, InputStream stream) throws JAXBException, SAXException, IOException { JAXBContext context = JAXBContext.newInstance(instance); Unmarshaller unmarshaller = context.createUnmarshaller(); Reader reader = new InputStreamReader(new BOMInputStream(stream), "UTF-8"); JAXBElement entry = unmarshaller.unmarshal(new StreamSource(reader), instance); return entry.getValue(); } 

Primero limpie el proyecto, luego reconstruya el proyecto. Yo también estaba enfrentando el mismo problema. Todo salió bien después de esto.