199 votes

org.xml.sax.SAXParseException : Le contenu n'est pas autorisé dans le prologue

J'ai un client de service web basé sur Java connecté à un service web Java (mis en œuvre sur le framework Axis1).

J'obtiens l'exception suivante dans mon fichier journal :

Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
    at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
    at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
    at org.apache.ws.axis.security.WSDoAllReceiver.invoke(WSDoAllReceiver.java:114)
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:198)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)

12 votes

Il serait utile que vous nous montriez le XML que vous essayez d'analyser. (Les premières lignes suffiraient, je pense).

1 votes

Merci Stephen, j'essaie de récupérer la requête XML du cadre AXIS et de la coller ici. La compréhension générale de l'erreur ci-dessus est donc que le XML n'est pas bien formé.

1 votes

J'ai eu ce problème parce que j'essayais de transformer le nom de la chaîne du fichier xml plutôt que le fichier xml en tant que chaîne ! :P

270voto

Mike Sokolov Points 3441

Cela est souvent dû à un espace blanc avant la déclaration XML, mais cela peut être tout texte comme un tiret ou tout autre caractère. Je dis souvent causé par l'espace blanc parce que les gens supposent que l'espace blanc est toujours ignorable, mais ce n'est pas le cas ici.


Une autre chose qui arrive souvent est un NOMENCLATURE UTF-8 (byte order mark), qui es autorisés avant la déclaration XML peuvent être traités comme des espaces blancs si le document est remis comme un flux de caractères à un analyseur XML plutôt que comme un flux d'octets.

La même chose peut se produire si des fichiers de schémas (.xsd) sont utilisés pour valider le fichier xml et que l'un des fichiers de schémas possède un NOMENCLATURE UTF-8 .

29 votes

Pour tous ceux qui, comme moi, ont du mal à comprendre ce qu'il faut faire avec John Humphreys - la suggestion de w00te : changer Document document = documentBuilder.parse(new InputSource(new StringReader(xml))) a Document document = documentBuilder.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("UTF-8"))))

38voto

Egor Points 101

En fait, en complément du poste de Yuriy Zubarev

Lorsque vous passez un fichier xml inexistant au parseur. Par exemple, vous passez

new File("C:/temp/abc")

lorsque seul le fichier C:/temp/abc.xml existe sur votre système de fichiers.

Dans les deux cas

builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
document = builder.parse(new File("C:/temp/abc"));

o

DOMParser parser = new DOMParser();
parser.parse("file:C:/temp/abc");

Tous donnent le même message d'erreur.

Bug très décevant, car la trace suivante

javax.servlet.ServletException
    at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
...
Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
... 40 more

ne dit rien sur le fait que "le nom du fichier est incorrect" ou "un tel fichier n'existe pas". Dans mon cas, j'avais un fichier xml absolument correct et j'ai dû passer deux jours à déterminer le vrai problème.

1 votes

Il en va de même pour l'analyse d'un répertoire au lieu d'un nom de fichier.

1 votes

... @Egor c'est pourquoi tout le monde déteste XML. Perdre 2 jours de travail pour un échec aussi stupide ...

1 votes

Absolument d'accord @Gewure :) C'était un ancien post de 2012 et je l'ai même oublié, mais c'est vrai.

28voto

hardmath Points 5346

Essayez d'ajouter un espace entre les encoding="UTF-8" dans le prologue et la chaîne de terminaison ?> . En XML, le prologue désigne cet élément délimité par des crochets et des points d'interrogation au début du document (alors que le tag prologue dans stackoverflow fait référence au langage de programmation).

Ajouté : Ce tiret devant votre prologue fait-il partie du document ? Ce serait l'erreur, avoir des données devant le prologue, -<?xml version="1.0" encoding="UTF-8"?> .

2 votes

+1. J'ai constaté que certains analyseurs XML refusent cette exception même lorsque le prologue XML contient des espaces - je pense donc qu'il vaut vraiment la peine de vérifier que rien ne précède l'élément <?xml ver... bit.

13voto

Yuriy Zubarev Points 1888

Cela signifie que le XML est malformé ou que le corps de la réponse n'est pas du tout un document XML.

0 votes

J'ai vérifié et il semble que le XML soit bien formé. Voici un instantané:-<?xml version="1.0" encoding="UTF-8"?> <soapenv:Enveloppe xmlns:soapenv=" schémas.xmlsoap.org/soap/enveloppe " xmlns:xsd=" w3.org/2001/XMLSchema " xmlns:xsi=" w3.org/2001/XMLSchema-instance "> <soapenv:Header> <wsse:Security xmlns:wsse=" docs.oasis-open.org/wss/2004/01/ " soapenv:mustUnderstand="1">.... </wsse:Security> </soapenv:Header><soapenv:Body>.XX..</soapenv:Body></soapenv:Enveloppe>

2 votes

Oui, s'il y a un tableau de bord devant, ça casserait le XML.

0 votes

Oui, j'ai accidentellement ajouté une lettre et cela a rendu le XML invalide et a causé l'erreur. Merci !

9voto

colin_froggatt Points 63

Je viens de passer 4 heures à chercher un problème similaire dans un WSDL. Il s'avère que le WSDL utilise un XSD qui importe un autre XSD d'espace de nom. Ce XSD importé contenait ce qui suit :

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.xyz.com/Services/CommonTypes" elementFormDefault="qualified"
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:CommonTypes="http://www.xyz.com/Services/CommonTypes">

 <include schemaLocation=""></include>  
    <complexType name="RequestType">
        <....

Notez le vide include élément ! C'était la racine de mes malheurs. Je suppose que c'est une variation du problème de fichier non trouvé d'Egor ci-dessus.

+1 pour décevoir les rapports d'erreurs.

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