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


161

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

Recibo la siguiente 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)

11
Sería útil que nos mostraras el XML que estás intentando analizar. (Solo las primeras líneas serían suficientes, espero)
Stephen C

Gracias Stephen, estoy tratando de recuperar la solicitud XML del marco AXIS y pegarla aquí. Entonces, la comprensión general del error anterior es que XML no está bien formado.
ag112

¡Tuve este problema porque estaba tratando de transformar el nombre de la cadena del archivo xml en lugar del archivo xml como una cadena! : P
Gaʀʀʏ

Respuestas:


242

Esto a menudo es causado por un espacio en blanco antes de la declaración 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 la gente asume 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 declaración XML se pueda tratar como un espacio 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 se usan archivos de esquema (.xsd) para validar el archivo xml y uno de los archivos de esquema tiene una lista de materiales UTF-8 .


17
Para todos, como yo, que luchan por entender qué hacer con John Humphreys - sugerencia de w00te: cambiar Document document = documentBuilder.parse(new InputSource(new StringReader(xml)))aDocument document = documentBuilder.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("UTF-8"))))
RealMan

32

En realidad, además de la publicación 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.

Error muy decepcionante, 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 'nombre de archivo incorrecto' o 'tal archivo no existe'. En mi caso, tenía el archivo xml absolutamente correcto y tuve que pasar 2 días para determinar el verdadero problema.


Lo mismo con tratar de analizar un directorio en lugar de un nombre de archivo, FWIW.
rogerdpack

... @Egor es por eso que todos odian XML. Perder 2 días de trabajo por un fracaso tan estúpido ..
Gewure

Absolutamente de acuerdo @Gewure :) Esa fue una publicación antigua de 2012 e incluso me olvido de eso, pero es cierto
Egor

1
Esto también sucede cuando tiene una ruta correcta, pero con símbolos especiales, como: C: \ # MyFolder \ My.XML El archivo existe, pero el "#" causa un problema al analizador XML ... Java en sí, así como M $ Windows, no tiene ningún problema con el nombre de esta carpeta ... Muy mal comportamiento del mensaje de excepción ...
Alex

26

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

Agregado: ¿Es ese guión frente a su prólogo parte del documento? Ese sería el error allí, tener datos en frente del prólogo, -<?xml version="1.0" encoding="UTF-8"?>.


1
+1. He descubierto que algunos analizadores XML evitan esta excepción incluso cuando el prólogo XML contiene espacios, por lo que creo que definitivamente vale la pena comprobar que nada precede al <?xml ver...bit.

11

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 codificación del archivo y el atributo de codificación XML son diferentes. (Ej: archivo UTF-8 con atributo UTF-16 en el encabezado).

Entonces tenía dos formas de resolver el problema:

  1. cambiar la codificación del archivo en sí
  2. cambiando el encabezado UTF-16 a UTF-8

1
Supongo que, en general, cualquier caso en el que el analizador reciba información contradictoria sobre la codificación de caracteres podría causar este problema.
Raedwald

9

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


Lo comprobé y parece que XML está bien formado. Aquí hay una instantánea: - <? Xml version = "1.0" encoding = "UTF-8"?> <Soapenv: Envelope xmlns: soapenv = " schemas.xmlsoap.org/soap/envelope " xmlns: xsd = " w3.org/ 2001 / XMLSchema "xmlns: xsi =" w3.org/2001/XMLSchema-instance "> <soapenv: Header> <wsse: Security xmlns: wsse =" docs.oasis-open.org/wss/2004/01/… " soapenv: mustUnderstand = "1"> .... </ wsse: Seguridad> </ soapenv: Encabezado> <soapenv: Body> .XX .. </ soapenv: Body> </ soapenv: Envelope>
ag112

1
Sí, si hay un guión al frente, se rompería XML.
Yuriy Zubarev

7

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

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.xyz.com/Services/CommonTypes" elementFormDefault="qualified"
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:CommonTypes="http://www.xyz.com/Services/CommonTypes">

 <include schemaLocation=""></include>  
    <complexType name="RequestType">
        <....

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

+1 a los informes de error decepcionantes.


4

En mi caso, eliminar el atributo 'encoding = "UTF-8"' funcionó por completo.

Parece un problema de codificación del juego de caracteres, tal vez porque su archivo no está realmente en UTF-8.


4

Mi respuesta probablemente no lo ayudaría, pero en general ayuda con este problema.

Cuando vea este tipo de excepción, debe intentar abrir su archivo xml en cualquier editor hexadecimal y en algún momento puede ver bytes adicionales al comienzo del archivo que el editor de texto no muestra.

Elimínelos y su xml será analizado.


4

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á lugar a este error,

[Error grave]: 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 cadena "file.xml"(no el contenido del file.xmlarchivo) y falla porque, "file.xml"como una cadena, no está bien formado XML.

Fijar: Eliminar StringReader():

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

Del mismo modo, los problemas de búfer sucio pueden dejar basura residual por delante del XML real. Si ha revisado cuidadosamente su XML y todavía recibe este error, registre el contenido exacto que se pasa al analizador; a veces lo que realmente se analiza (se intenta que se analice) es sorprendente.


1
Esta solución se guió en la ruta correcta ya que olvidé agregar la applicaionContext.xmlruta en el código, y no estaba registrando el código, solo estaba buscando un error en el archivo XML
Mrinmoy

3

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


2

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


2

Por 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");

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

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


2

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

Si su XML de entrada se lee como una Cadena (en oposición a la matriz de bytes), puede usar reemplazar su cadena de entrada con el código siguiente para asegurarse de que todos los caracteres 'innecesarios' antes de la etiqueta xml se borren.

inputXML=inputXML.substring(inputXML.indexOf("<?xml"));

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


2

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

espacio extra

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


1

Seguí las instrucciones encontradas aquí y recibí el mismo error.

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

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


1

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 ser causado al hacer cambios con un editor de texto que introduce la basura.

La forma en que puede verificar si tiene o no basura en el archivo es abrirlo con un "Editor HEX" Si ve algún carácter antes de esta cadena

     "<?xml version="1.0" encoding="UTF-8"?>"

como esto sería basura

     "‰ŠŒ<?xml version="1.0" encoding="UTF-8"?>"

ese es su problema ... La solución es usar un buen editor HEX ... Uno que le permita guardar archivos con diferentes tipos de codificación ...

Luego solo guárdelo como UTF-8. Algunos sistemas que usan archivos XML pueden necesitar que se guarden como UTF SIN BOM, lo que significa "SIN marca de orden de bytes"

Espero que esto ayude a alguien por ahí!



1

Para solucionar el problema de BOM en sistemas Unix / Linux:

  1. Compruebe si hay un carácter BOM no deseado: hexdump -C myfile.xml | more un carácter BOM no deseado aparecerá al comienzo del archivo como...<?xml>

  2. Alternativamente, hazlo file myfile.xml. Un archivo con un carácter BOM aparecerá como:myfile.xml: XML 1.0 document text, UTF-8 Unicode (with BOM) text

  3. Arregle un solo archivo con: tail -c +4 myfile.xml > temp.xml && mv temp.xml myfile.xml

  4. Repita 1 o 2 para verificar que el archivo ha sido desinfectado. Probablemente también sea sensato hacer view myfile.xmlpara verificar los contenidos que se han quedado.

Aquí hay un script bash para desinfectar una carpeta completa de archivos XML:

#!/usr/bin/env bash

# This script is to sanitise XML files to remove any BOM characters

has_bom() { head -c3 "$1" | LC_ALL=C grep -qe '\xef\xbb\xbf'; }

for filename in *.xml ; do
  if has_bom ${filename}; then
    tail -c +4 ${filename} > temp.xml
    mv temp.xml ${filename}
  fi
done

0

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


Me aseguré de no tocar ninguna tecla
Mad-D

0

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 estaba creando una respuesta XML para una llamada de RestFull Webservice. Al crear la cadena de formato XML, reemplacé el & lt y & gt con <y> luego el error se apagó y estaba obteniendo la respuesta adecuada. No estoy seguro de cómo funcionó, pero funcionó.

muestra :

String body = "<ns:addNumbersResponse xmlns:ns=\"http://java.duke.org\"><ns:return>"
            +sum
            +"</ns:return></ns:addNumbersResponse>";

0

Tuve el mismo problema.

Primero descargué el archivo XML al escritorio local y lo obtuve Content is not allowed in prologdurante la importación del archivo al servidor del portal. Incluso el archivo visual 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ó.


0

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 configuró un bean "JaxWsPortProxyFactoryBean" para exponer un proxy para un puerto remoto.

<bean id="ourPortJaxProxyService"
    class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"
    p:serviceInterface="com.amir.OurServiceSoapPortWs"
    p:wsdlDocumentUrl="${END_POINT_BASE_URL}/OurService?wsdl"
    p:namespaceUri="http://amir.com/jaxws" p:serviceName="OurService"
    p:portName="OurSoapPort" />

"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 malformada y, por lo tanto, la mala respuesta. Es decir, en lugar de "BusinessAppServices / OurService? Wsdl", la URL tenía un CR antes de "/". "Monitor TCP / IP" fue bastante útil al solucionar el problema.


0

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, el valor predeterminado fue el formato XML, pero cuando invoqué la misma llamada desde una aplicación Java, la API devolvió la respuesta con formato JSON, que naturalmente provocó un error de análisis.


0

Incluso me había enfrentado a un problema similar. La razón era un personaje basura al comienzo del archivo.

Solución: simplemente 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 errores de análisis.


0

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

}


0

Configure su documento para que se forme así:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    %children%
</root>

0

Tuve el mismo problema con la primavera

MarshallingMessageConverter

y por código de preproceso.

Puede que alguien necesite una razón: BytesMessage #readBytes - leyendo bytes ... y olvidé que la lectura es una operación en una dirección. No puedes leer dos veces.


0

Pruebe con BOMInputStream en apache.commons.io:

public static <T> T getContent(Class<T> 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<T> entry = unmarshaller.unmarshal(new StreamSource(reader), instance);

    return entry.getValue();
}

0

Estaba teniendo el mismo problema al analizar el info.plistarchivo en mi mac. Sin embargo, el problema se solucionó utilizando el siguiente comando que convirtió el archivo en un XML.

plutil -convert xml1 info.plist

Espero que ayude a alguien.


0

Tuve el mismo problema con algunos archivos XML, resolví leer el archivo con codificación ANSI (Windows-1252) y escribir un archivo con codificación UTF-8 con un pequeño script en Python. Intenté usar Notepad ++ pero no tuve éxito:

import os
import sys

path = os.path.dirname(__file__)

file_name = 'my_input_file.xml'

if __name__ == "__main__":
    with open(os.path.join(path, './' + file_name), 'r', encoding='cp1252') as f1:
        lines = f1.read()
        f2 = open(os.path.join(path, './' + 'my_output_file.xml'), 'w', encoding='utf-8')
        f2.write(lines)
        f2.close()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.