Je me suis cogné la tête contre ce bug absolument exaspérant pendant les 48 dernières heures, alors j'ai pensé que je jetterais enfin l'éponge et essayerais de demander ici avant de jeter mon ordinateur portable par la fenêtre.
J'essaie d'analyser le XML de réponse d'un appel que j'ai passé à AWS SimpleDB. La réponse revient très bien sur le fil; par exemple, cela peut ressembler à:
<?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>
Je passe ce XML à un analyseur avec
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
et appelez plusieurs eventReader.nextEvent();
fois pour obtenir les données que je veux.
Voici la partie bizarre - cela fonctionne très bien à l'intérieur du serveur local. La réponse arrive, je l'analyse, tout le monde est content. Le problème est que lorsque je déploie le code sur Google App Engine, la requête sortante fonctionne toujours et le XML de réponse me semble 100% identique et correct, mais la réponse ne parvient pas à être analysée à l'exception suivante:
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)
J'ai vérifié double, triple, quadruple ce XML pour les «caractères invisibles» ou les caractères codés non UTF8, etc. Je l'ai regardé octet par octet dans un tableau pour les marques d'ordre d'octet ou quelque chose de cette nature. Rien; il passe tous les tests de validation que je pourrais lui lancer. Encore plus étrange, cela arrive si j'utilise également un analyseur basé sur Saxon - mais UNIQUEMENT sur GAE, cela fonctionne toujours bien dans mon environnement local.
Il est très difficile de suivre le code pour les problèmes lorsque je ne peux exécuter le débogueur que sur un environnement qui fonctionne parfaitement (je n'ai trouvé aucun bon moyen de déboguer à distance sur GAE). Néanmoins, en utilisant les moyens primitifs dont je dispose, j'ai essayé un million d'approches, notamment:
- XML avec et sans le prologue
- Avec et sans nouvelles lignes
- Avec et sans l'attribut "encoding =" dans le prologue
- Les deux styles de nouvelle ligne
- Avec et sans les informations de segmentation présentes dans le flux HTTP
Et j'ai essayé la plupart d'entre eux dans de multiples combinaisons où il était logique qu'ils interagissent - rien! Je suis à bout de souffle. Quelqu'un a-t-il déjà vu un problème comme celui-ci qui, espérons-le, peut éclairer le sujet?
Merci!