168 votes

"Content is not allowed in prolog" lors de l'analyse d'un XML parfaitement valide sur GAE

Cela fait 48 heures que je me bats contre ce bug absolument exaspérant, alors j'ai pensé jeter l'éponge et essayer de poser la question ici avant de jeter mon ordinateur portable par la fenêtre.

J'essaie d'analyser la réponse XML d'un appel que j'ai fait à AWS SimpleDB. La réponse revient correctement sur le fil ; par exemple, elle peut ressembler à ce qui suit :

<?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 transmets ce XML à un analyseur syntaxique avec

XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());

et appeler eventReader.nextEvent(); plusieurs fois pour obtenir les données souhaitées.

Voici la partie la plus bizarre : cela fonctionne parfaitement sur le 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 la réponse me semble 100% identique et correct, mais la réponse ne parvient pas à être analysée avec 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é deux fois, trois fois, quatre fois ce XML à la recherche de "caractères invisibles" ou de caractères non codés en UTF8, etc. Je l'ai examiné octet par octet dans un tableau à la recherche de marques d'ordre d'octet ou de quelque chose de ce genre. Je l'ai examiné octet par octet dans un tableau à la recherche de marques d'ordre d'octet ou de quelque chose de ce genre. Plus étrange encore, cela se produit également si j'utilise un analyseur basé sur Saxon - mais UNIQUEMENT sur GAE, cela fonctionne toujours très bien dans mon environnement local.

Cela rend très difficile la recherche de problèmes dans le code lorsque je ne peux exécuter le débogueur que dans un environnement qui fonctionne parfaitement (je n'ai pas trouvé de bon moyen de déboguer à distance sur GAE). Néanmoins, avec les moyens primitifs dont je dispose, j'ai essayé un million d'approches, y compris :

  • XML avec et sans prologue
  • Avec et sans nouvelles lignes
  • Avec et sans l'attribut "encoding=" dans le prologue
  • Les deux styles de retour à la ligne
  • Avec et sans les informations de découpage 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 ne sais plus où donner de la tête. Est-ce que quelqu'un a déjà rencontré un problème de ce type et pourrait, si possible, m'éclairer ?

Gracias.

173voto

Romain Hippeau Points 16175

Le codage de votre XML et de votre XSD (ou DTD) est différent.
En-tête du fichier XML : <?xml version='1.0' encoding='utf-8'?>
En-tête du fichier XSD : <?xml version='1.0' encoding='utf-16'?>

Un autre scénario possible est celui où quelque chose précède la déclaration de type de document XML, c'est-à-dire que vous pourriez avoir quelque chose comme ceci dans le tampon :

helloworld<?xml version="1.0" encoding="utf-8"?>  

ou même un espace ou un caractère spécial.

Certains caractères spéciaux, appelés marqueurs d'ordre d'octet, peuvent se trouver dans la mémoire tampon. Avant de passer le tampon à l'analyseur, faites ceci...

String xml = "<?xml ...";
xml = xml.trim().replaceFirst("^([\\W]+)<","<");

14voto

techloris_109 Points 341

J'ai eu un problème en inspectant le fichier xml dans notepad++ et en sauvegardant le fichier, bien que j'ai eu la balise utf-8 xml supérieure comme suit <?xml version="1.0" encoding="utf-8"?>

Le problème a été résolu en sauvegardant le fichier dans notpad++ avec Encoding(Tab) > Encode in UTF-8:selected (qui était Encode in UTF-8-BOM).

10voto

Sunmit Girme Points 196

Ce message d'erreur est toujours dû à un contenu XML non valide dans l'élément de départ. Par exemple, un petit point supplémentaire "." au début de l'élément XML.

Tous les caractères précédant le " <?xml…. " provoquera le " org.xml.sax.SAXParseException : Le contenu n'est pas autorisé dans le prologue Message d'erreur ".

Un petit point " . "avant le “<?xml….

Pour y remédier, il suffit d'effacer tous les caractères bizarres qui précèdent le symbole “<?xml“ .

Réf : http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/

7voto

matjung Points 133

J'ai reçu le même message d'erreur aujourd'hui. La solution a été de changer le document de UTF-8 avec nomenclature à UTF-8 sans nomenclature.

6voto

Raj Points 1

Je suis confronté au même problème. Dans mon cas, des fichiers XML ont été générés à partir d'un programme c# et introduits dans l'AS400 pour un traitement ultérieur. Après analyse, j'ai constaté que j'utilisais l'encodage UTF8 lors de la génération des fichiers XML, alors que javac (dans l'AS400) utilise "UTF8 sans BOM". J'ai donc dû écrire un code supplémentaire similaire à celui mentionné ci-dessous :

//create encoding with no BOM
Encoding outputEnc = new UTF8Encoding(false); 
//open file with encoding
TextWriter file = new StreamWriter(filePath, false, outputEnc);           

file.Write(doc.InnerXml);
file.Flush();
file.Close(); // save and close it

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X