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!