“Le contenu n’est pas autorisé dans prolog” lors de l’parsing du code XML parfaitement valide sur GAE

Je me suis battu la tête contre ce virus absolument exaspérant pendant les dernières 48 heures, alors j’ai pensé que je finirais par jeter l’éponge et demander ici avant de jeter mon ordinateur par la fenêtre.

J’essaie d’parsingr le XML de réponse d’un appel que j’ai fait à AWS SimpleDB. La réponse revient sur le fil juste bien; Par exemple, cela peut ressembler à:

   Audio Course DocumentContents LectureSet MetaData Professors Tag   42330b4a-e134-6aec-e62a-5869ac2b4575 0.0000071759   

Je passe ce XML à un parsingur avec

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

et appelez eventReader.nextEvent(); un tas de fois pour obtenir les données que je veux.

Voici la partie bizarre – elle fonctionne très bien sur le serveur local. La réponse arrive, je l’parsing, 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 semble identique à 100% et correct, mais la réponse ne parvient pas à parsingr 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.):  AudioCourseDocumentContentsLectureSetMetaDataProfessorsTag42330b4a-e134-6aec-e62a-5869ac2b45750.0000071759 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 ce double, sortingple, quadruple vérifié ce XML pour les «caractères invisibles» ou les caractères non encodés 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 réussit tous les tests de validation que je pourrais y lancer. Encore plus étrange, cela arrive si j’utilise également un parsingur basé sur Saxon – mais UNIQUEMENT sur GAE, cela fonctionne toujours bien dans mon environnement local.

Il est très difficile de retrouver le code des problèmes lorsque je ne peux exécuter le débogueur que dans un environnement qui fonctionne parfaitement (je n’ai pas trouvé de moyen de déboguer à distance sur GAE). Néanmoins, en utilisant les moyens primitifs que j’ai, j’ai essayé un million d’approches, notamment:

  • XML avec et sans le prolog
  • Avec et sans nouvelles lignes
  • Avec et sans l’atsortingbut “encoding =” dans le prolog
  • Les deux styles de nouvelle ligne
  • Avec et sans les informations de segmentation présentes dans le stream HTTP

Et j’ai essayé la plupart de ces combinaisons multiples où il était logique d’interagir – rien! Je suis à bout de souffle. Quelqu’un a-t-il déjà vu un problème comme celui-ci, cela pourrait peut-être nous éclairer?

Merci!

L’encodage dans votre XML et XSD (ou DTD) est différent.
En-tête de 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 que tout ce qui vient avant la déclaration de type de document XML. c’est à dire que vous pourriez avoir quelque chose comme ça dans le tampon:

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

ou même un espace ou un personnage spécial.

Il existe des caractères spéciaux appelés marqueurs d’ordre des octets qui pourraient se trouver dans le tampon. Avant de passer le tampon à l’parsingur, faites ceci …

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

Ce message d’erreur est toujours provoqué par le contenu XML non valide dans l’élément de début. Par exemple, extra petit point “.” Au début de l’élément XML.

Des caractères avant le « < ?xml….Provoquera ci-dessus“ org.xml.sax.SAXParseException: message d'erreur contenu interdit dans le prolog ”.

Un petit point “ . ”Avant le “< ?xml….

Pour résoudre ce problème, supprimez simplement tous ces caractères étranges avant le “< ?xml“ .

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

Je faisais face au même problème. Dans mon cas, les fichiers XML ont été générés à partir du programme c # et transmis à AS400 pour un traitement ultérieur. Après quelques parsings ont identifié que j’utilisais l’encodage UTF8 lors de la génération de fichiers XML alors que javac (sous AS400) utilise “UTF8 sans BOM”. Donc, a dû écrire du code supplémentaire similaire à 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 

Dans mon fichier xml, l’en-tête ressemblait à ceci:

 < ?xml version="1.0" encoding="utf-16"? /> 

Dans un fichier de test, je lisais les octets du fichier et décodais les données en UTF-8 (ne réalisant pas que l’en-tête de ce fichier était utf-16) pour créer une chaîne.

 byte[] data = Files.readAllBytes(Paths.get(path)); Ssortingng dataSsortingng = new Ssortingng(data, "UTF-8"); 

Lorsque j’ai essayé de désérialiser cette chaîne dans un object, je voyais la même erreur:

 javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] Message: Content is not allowed in prolog. 

Lorsque j’ai mis à jour la deuxième ligne pour

 Ssortingng dataSsortingng = new Ssortingng(data, "UTF-16"); 

J’ai pu désérialiser l’object très bien. Donc, comme Romain l’avait déjà noté, les encodages doivent correspondre.

J’étais confronté au même problème appelé “Le contenu n’est pas autorisé dans prolog” dans mon fichier xml.

Solution

Au départ, mon dossier racine était “# Filename “.

Lorsque j’ai supprimé le premier caractère ‘#’, l’erreur a été résolue.

Pas besoin de supprimer le #filename … Essayez de cette façon ..

Au lieu de transmettre un object File ou URL à la méthode unmarshaller, utilisez un object FileInputStream.

 File myFile = new File("........"); Object obj = unmarshaller.unmarshal(new FileInputStream(myFile)); 

J’avais un caractère de tabulation au lieu d’espaces. Remplacement de l’onglet ‘\ t’ résolu le problème.

Coupez et collez le document entier dans un éditeur comme Notepad ++ et affichez tous les caractères.

Dans mon cas du problème, la solution consistait à remplacer les trémas allemands (äöü) par leurs équivalents HTML …

ci-dessous sont la cause ci-dessus “org.xml.sax.SAXParseException: le contenu n’est pas autorisé dans l’exception de prolog”.

  1. Vérifiez d’abord le chemin du fichier schema.xsd et file.xml.
  2. L’encodage dans votre XML et XSD (ou DTD) devrait être le même.
    En-tête de fichier XML: < ?xml version='1.0' encoding='utf-8'?>
    En-tête du fichier XSD: < ?xml version='1.0' encoding='utf-8'?>
  3. si quelque chose vient avant le type de document XML declaration.ie: hello< ?xml version='1.0' encoding='utf-16'?>

Dans mon cas, j’ai eu le problème avec un build.xml . Cela a été résolu avec juste aller à Build > Clean Project .

Dans l’esprit de “il suffit de supprimer tous ces caractères étranges avant le < ? Xml", voici mon code Java, qui fonctionne bien avec les entrées via un BufferedReader:

  BufferedReader test = new BufferedReader(new InputStreamReader(fisTest)); test.mark(4); while (true) { int earlyChar = test.read(); System.out.println(earlyChar); if (earlyChar == 60) { test.reset(); break; } else { test.mark(4); } } 

FWIW, les octets que je voyais sont (en décimal): 239, 187, 191.

La suppression de la déclaration XML l’a résolue

 < ?xml version='1.0' encoding='utf-8'?> 

J’avais un problème lors de l’inspection du fichier xml dans notepad ++ et de l’enregistrement du fichier, même si j’avais la balise xml utf-8 supérieure en tant que < ?xml version="1.0" encoding="utf-8"?>

A été corrigé en sauvegardant le fichier dans notpad ++ avec Encoding (Tab)> Encode dans UTF-8: sélectionné (était Encode dans UTF-8-BOM)