Me he estado golpeando la cabeza contra este error absolutamente exasperante durante las últimas 48 horas, así que pensé que finalmente arrojaría la toalla e intentaría preguntar aquí antes de tirar mi computadora portátil por la ventana.
Estoy tratando de analizar el XML de respuesta de una llamada que hice a AWS SimpleDB. La respuesta está regresando muy bien por el cable; por ejemplo, puede verse así:
<?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
<ListDomainsResult>
<DomainName>Audio</DomainName>
<DomainName>Course</DomainName>
<DomainName>DocumentContents</DomainName>
<DomainName>LectureSet</DomainName>
<DomainName>MetaData</DomainName>
<DomainName>Professors</DomainName>
<DomainName>Tag</DomainName>
</ListDomainsResult>
<ResponseMetadata>
<RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId>
<BoxUsage>0.0000071759</BoxUsage>
</ResponseMetadata>
</ListDomainsResponse>
Paso este XML a un analizador con
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
y llamo eventReader.nextEvent();
varias veces para obtener los datos que quiero.
Aquí está la parte extraña: funciona muy bien dentro del servidor local. La respuesta llega, la analizo, todos están felices. El problema es que cuando implemento el código en Google App Engine, la solicitud saliente todavía funciona, y el XML de respuesta me parece 100% idéntico y correcto, pero la respuesta no se analiza con la siguiente excepción:
com.amazonaws.http.HttpClient handleResponse: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.): <?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"><ListDomainsResult><DomainName>Audio</DomainName><DomainName>Course</DomainName><DomainName>DocumentContents</DomainName><DomainName>LectureSet</DomainName><DomainName>MetaData</DomainName><DomainName>Professors</DomainName><DomainName>Tag</DomainName></ListDomainsResult><ResponseMetadata><RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId><BoxUsage>0.0000071759</BoxUsage></ResponseMetadata></ListDomainsResponse>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source)
at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source)
at com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:153)
... (rest of lines omitted)
He comprobado doble, triple, cuádruple este XML en busca de "caracteres invisibles" o caracteres no codificados en UTF8, etc. Lo miré byte por byte en una matriz de marcas de orden de bytes o algo de esa naturaleza. Nada; pasa todas las pruebas de validación que pude hacerle. Aún más extraño, sucede si también uso un analizador basado en Saxon, pero SOLO en GAE, siempre funciona bien en mi entorno local.
Hace que sea muy difícil rastrear el código en busca de problemas cuando solo puedo ejecutar el depurador en un entorno que funciona perfectamente (no he encontrado ninguna buena manera de depurar de forma remota en GAE). Sin embargo, usando los medios primitivos que tengo, probé un millón de enfoques que incluyen:
- XML con y sin prólogo
- Con y sin nuevas líneas
- Con y sin el atributo "encoding =" en el prólogo
- Ambos estilos de nueva línea
- Con y sin la información fragmentada presente en el flujo HTTP
Y probé la mayoría de estos en múltiples combinaciones donde tenía sentido que interactuaran, ¡nada! Estoy al final de mi ingenio. ¿Alguien ha visto un problema como este antes que, con suerte, pueda arrojar algo de luz sobre él?
¡Gracias!
Respuestas:
La codificación en su XML y XSD (o DTD) son diferentes.
Encabezado del archivo XML:
<?xml version='1.0' encoding='utf-8'?>
encabezado del archivo XSD:
<?xml version='1.0' encoding='utf-16'?>
Otro escenario posible que causa esto es cuando algo viene antes de la declaración del tipo de documento XML. es decir, es posible que tenga algo como esto en el búfer:
o incluso un espacio o carácter especial.
Hay algunos caracteres especiales llamados marcadores de orden de bytes que podrían estar en el búfer. Antes de pasar el búfer al analizador, haga esto ...
fuente
Este mensaje de error siempre es causado por el contenido XML no válido en el elemento inicial. Por ejemplo, un punto extra pequeño "." al comienzo del elemento XML.
Cualquier carácter antes de "
<?xml….
" provocará el mensaje de error " org.xml.sax.SAXParseException: Contenido no permitido en el prólogo ".Un pequeño punto ” . " antes de
“<?xml….
Para solucionarlo, simplemente elimine todos esos caracteres extraños antes del
“<?xml“
.Ref: http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/
fuente
Estaba enfrentando el mismo problema. En mi caso, los archivos XML se generaron desde el programa c # y se enviaron a AS400 para su posterior procesamiento. Después de un análisis, identifiqué que estaba usando codificación UTF8 mientras generaba archivos XML mientras que javac (en AS400) usa "UTF8 sin BOM". Entonces, tuve que escribir un código adicional similar al que se menciona a continuación:
fuente
Tuve un problema al inspeccionar el archivo xml en notepad ++ y guardar el archivo, aunque tenía la etiqueta xml utf-8 superior como
<?xml version="1.0" encoding="utf-8"?>
Se solucionó al guardar el archivo en notpad ++ con Codificación (Tab)> Codificar en UTF-8: seleccionado (fue Codificar en UTF-8-BOM)
fuente
Eliminar la declaración xml lo resolvió
fuente
En mi archivo xml, el encabezado se veía así:
En un archivo de prueba, estaba leyendo los bytes del archivo y decodificando los datos como UTF-8 (sin darme cuenta de que el encabezado en este archivo era utf-16) para crear una cadena.
Cuando intenté deserializar esta cadena en un objeto, estaba viendo el mismo error:
Cuando actualicé la segunda línea a
Pude deserializar el objeto sin problemas. Entonces, como Romain señaló anteriormente, las codificaciones deben coincidir.
fuente
Estaba enfrentando el mismo problema llamado "El contenido no está permitido en el prólogo" en mi archivo xml.
Solución
Inicialmente, mi carpeta raíz era '# Nombre de archivo '.
Cuando eliminé el primer carácter '#', el error se resolvió.
No es necesario eliminar el #filename ... Inténtelo de esta manera ...
En lugar de pasar un objeto File o URL al método unmarshaller, use FileInputStream.
fuente
Razón inesperada:
#
carácter en la ruta del archivoDebido a algún error interno, el error Contenido no permitido en el prólogo también aparece si el contenido del archivo en sí es 100% correcto, pero está proporcionando el nombre del archivo como
C:\Data\#22\file.xml
.Esto posiblemente también se aplique a otros caracteres especiales.
Cómo verificarlo: Si mueve su archivo a una ruta sin caracteres especiales y el error desaparece, entonces fue este problema.
fuente
Recibí el mismo mensaje de error hoy. La solución fue cambiar el documento de UTF-8 con BOM a UTF-8 sin BOM
fuente
Tenía un carácter de tabulación en lugar de espacios. Reemplazar la pestaña '\ t' solucionó el problema.
Corta y pega todo el documento en un editor como Notepad ++ y muestra todos los caracteres.
fuente
En mi caso del problema, la solución fue reemplazar diéresis alemanas (äöü) con sus equivalentes HTML ...
fuente
A continuación se muestran las causas anteriores a la excepción "org.xml.sax.SAXParseException: el contenido no está permitido en el prólogo".
Encabezado del archivo XML:
<?xml version='1.0' encoding='utf-8'?>
encabezado del archivo XSD:
<?xml version='1.0' encoding='utf-8'?>
hello<?xml version='1.0' encoding='utf-16'?>
fuente
Con el espíritu de "eliminar todos esos caracteres extraños antes del <? Xml", aquí está mi código Java, que funciona bien con la entrada a través de un BufferedReader:
FWIW, los bytes que estaba viendo son (en decimal): 239, 187, 191.
fuente