He estado golpeando mi cabeza contra este error absolutamente exasperante durante las últimas 48 horas, así que pensé que finalmente tiraría la toalla y trataría de preguntar aquí antes de tirar mi computadora portátil por la ventana."El contenido no está permitido en prolog" al analizar XML perfectamente válido en GAE
Estoy tratando de analizar el XML de respuesta de una llamada que realicé a AWS SimpleDB. La respuesta está volviendo al hilo bien; por ejemplo, puede verse como:
<?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>
que pase en este XML a un analizador con
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
y llamo eventReader.nextEvent();
un montón de veces para obtener los datos que quiero.
Aquí está la parte extraña: funciona genial dentro del servidor local. La respuesta viene, lo analizo, todos están felices. El problema es que cuando puedo implementar el código de Google App Engine, la petición de salida sigue funcionando, y la respuesta XML parece idéntica al 100% y correcta para mí, pero la respuesta no puede analizar 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)
Compruebo doble, triple y cuádruple este XML para caracteres "invisibles" o no codificados en UTF8, etc. Lo miré byte a byte en una matriz para marcas de orden de bytes o algo de esa naturaleza. Nada; pasa todas las pruebas de validación que pude lanzar. Aún más extraño, sucede si uso un analizador basado en Saxon también, pero SOLAMENTE en GAE, siempre funciona bien en mi entorno local.
Hace que sea muy difícil rastrear el código de problemas cuando solo puedo ejecutar el depurador en un entorno que funciona a la perfección (no he encontrado una buena manera de depurar de forma remota en GAE). Sin embargo, el uso de los medios primitivos que tengo, lo he intentado un millón de enfoques, incluyendo:
- XML con y sin el prólogo
- Con y sin saltos de línea
- con y sin el "encoding =" atributo en el prólogo
- Ambos estilos de nueva línea
- con y sin la información de fragmentación presente en la corriente de HTTP
y no tengo intenté 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 de que pueda arrojar algo de luz sobre él?
Gracias!
Probablemente vamos a necesitar ver más código. Otra posibilidad es que a nivel local no se fragmente mientras está en GAE. ¿Cómo maneja el código antes de pasarlo al analizador? –
Consideré la posibilidad de fragmentación también, pero no parece ser el caso dado que el mensaje de error que arroja el analizador contiene el XML completo allí mismo (está pegado arriba). El código completo SDK modificado se puede encontrar en http://github.com/AdrianP/aws-sdk-for-java (vea los commits más recientes) pero hay MUCHO código allí. Trataré de crear pronto una muestra reproducible más pequeña, aunque incluso eso será difícil. Es una gran pieza de software complicada ... ¡Gracias por tus comentarios! :) –
posible duplicado de [org.xml.sax.SAXParseException: el contenido no está permitido en prolog] (http://stackoverflow.com/questions/5138696/org-xml-sax-saxparseexception-content-is-not-allowed -en-prólogo) – Raedwald