org.xml.sax.SAXParseException: il contenuto non è consentito in prolog


161

Ho un client di servizi Web basato su Java collegato al servizio Web Java (implementato sul framework Axis1).

Ricevo la seguente eccezione nel mio file di registro:

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)

11
Sarebbe utile se ci mostrassi l'XML che stai cercando di analizzare. (Mi aspetto solo le prime poche righe.)
Stephen C,

Grazie Stephen, sto cercando di recuperare la richiesta XML dal framework AXIS e incollarla qui. Quindi la comprensione generale dell'errore sopra riportato è che l'XML non è ben formato.
ag112,

Ho avuto questo problema perché stavo cercando di trasformare il nome stringa del file xml anziché il file xml come stringa! : P
Gaʀʀʏ

Risposte:


243

Questo è spesso causato da uno spazio bianco prima della dichiarazione XML, ma potrebbe essere qualsiasi testo , come un trattino o qualsiasi carattere. Dico spesso causato dallo spazio bianco perché le persone presumono che lo spazio bianco sia sempre ignorabile, ma non è così.


Un'altra cosa che succede spesso è a distinta base UTF-8 (contrassegno dell'ordine dei byte), che è consentita prima che la dichiarazione XML possa essere trattata come spazio se il documento viene consegnato come flusso di caratteri a un parser XML anziché come flusso di byte .

Lo stesso può accadere se i file di schema (.xsd) vengono utilizzati per convalidare il file xml e uno dei file di schema ha una DBA UTF-8 .


17
Per tutti come me, che fatica a capire cosa fare di John Humphreys - il suggerimento di w00te: cambia Document document = documentBuilder.parse(new InputSource(new StringReader(xml)))inDocument document = documentBuilder.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("UTF-8"))))
RealMan

32

In realtà oltre a Yuriy Zubarev's Post

Quando si passa un file xml inesistente al parser. Ad esempio si passa

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

quando esiste solo il file C: /temp/abc.xml sul tuo file system

In ogni caso

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

o

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

Tutti danno lo stesso messaggio di errore.

Bug molto deludente, perché la seguente traccia

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

non dice nulla sul fatto che "il nome del file non è corretto" o "tale file non esiste". Nel mio caso avevo un file xml assolutamente corretto e ho dovuto trascorrere 2 giorni per determinare il vero problema.


Lo stesso vale per il tentativo di analizzare una directory anziché un nome file, FWIW.
rogerdpack,

... @Egor questo è il motivo per cui tutti odiano l'XML. Perdere 2 giorni di lavoro per un così stupido fallimento ...
Gewure,

Assolutamente d'accordo @Gewure :) Era un post antico del 2012 e me ne dimentico persino, ma è vero
Egor,

1
Questo succede anche quando hai un percorso corretto, ma con simboli speciali, come: C: \ # MyFolder \ My.XML Il file esiste, ma il "#" porta problemi al parser XML ... Java stesso, così come M $ Windows, non ha alcun problema con questo nome di cartella .... Pessimo comportamento del messaggio di eccezione ....
Alex

26

Prova ad aggiungere uno spazio tra la encoding="UTF-8"stringa nel prologo e la terminazione ?>. In XML il prologo indica questo elemento delimitato da un punto di domanda tra parentesi all'inizio del documento (mentre il tag prologo in stackoverflow si riferisce al linguaggio di programmazione).

Aggiunto: quel trattino di fronte al tuo prologo fa parte del documento? Questo sarebbe l'errore c'è, avendo i dati davanti al prologo, -<?xml version="1.0" encoding="UTF-8"?>.


1
+1. Ho scoperto che alcuni parser XML rivelano questa eccezione anche quando il prologo XML contiene spazi - quindi penso che valga la pena verificare che nulla precede il <?xml ver...bit.

11

Ho avuto lo stesso problema (e risolto) durante il tentativo di analizzare un documento XML con Freemarker.

Non avevo spazi prima dell'intestazione del file XML.

Il problema si verifica quando e solo quando la codifica del file e l'attributo di codifica XML sono diversi. (es: file UTF-8 con attributo UTF-16 nell'intestazione).

Quindi ho avuto due modi per risolvere il problema:

  1. cambiando la codifica del file stesso
  2. cambiando l'intestazione UTF-16 in UTF-8

1
Immagino che in generale ogni caso in cui il parser riceva informazioni contrastanti sulla codifica dei caratteri potrebbe causare questo problema.
Raedwald,

9

Significa che XML non è corretto o che il corpo della risposta non è affatto un documento XML.


Ho controllato e sembra che XML sia ben formato. Ecco lo snapshot: - <? Xml version = "1.0" encoding = "UTF-8"?> <Soapenv: Envelope xmlns: soapenv = " schemas.xmlsoap.org/soap/envelope " 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: Sicurezza> </ soapenv: Header> <soapenv: Body> .XX .. </ soapenv: Body> </ soapenv: Envelope>
ag112

1
Sì, se c'è un trattino di fronte, si romperebbe XML.
Yuriy Zubarev,

7

Ho appena trascorso 4 ore a rintracciare un problema simile in un WSDL. Si scopre che WSDL ha usato un XSD che importa un altro XSD spazio dei nomi. Questo XSD importato conteneva quanto segue:

<?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">
        <....

Nota il vuoto include elemento ! Questa era la radice dei miei guai. Immagino che questa sia una variazione del file Egor non trovato sopra il problema.

+1 alla segnalazione di errori deludenti.


4

Nel mio caso, la rimozione dell'attributo 'encoding = "UTF-8"' ha funzionato del tutto.

Sembra un problema di codifica del set di caratteri, forse perché il tuo file non è realmente in UTF-8.


4

La mia risposta non ti aiuterà probabilmente, ma in genere aiuta a risolvere questo problema.

Quando vedi questo tipo di eccezione, dovresti provare ad aprire il tuo file xml in qualsiasi editor esadecimale e a volte puoi vedere byte aggiuntivi all'inizio del file che l'editor di testo non mostra.

Eliminali e il tuo XML verrà analizzato.


4

A volte è il codice, non l'XML

Il seguente codice,

Document doc = dBuilder.parse(new InputSource(new StringReader("file.xml")));

comporterà anche questo errore,

[Errore irreversibile]: 1: 1: il contenuto non è consentito in prolog.org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Il contenuto non è consentito in prolog.

perché sta tentando di analizzare la stringa letterale "file.xml"(non il contenuto del file.xmlfile) e non riesce perché"file.xml" una stringa non è un XML ben formato.

Correzione: Rimuovi StringReader():

Document doc = dBuilder.parse(new InputSource("file.xml"));

Allo stesso modo, i problemi del buffer sporco possono lasciare spazzatura residua davanti all'XML reale. Se hai controllato attentamente il tuo XML e stai ancora riscontrando questo errore, registra il contenuto esatto che viene passato al parser; a volte ciò che viene effettivamente analizzato (provato a essere analizzato) è sorprendente.


1
Questa soluzione ha guidato nel giusto percorso, poiché ho dimenticato di aggiungere il applicaionContext.xmlpercorso nel codice e non stavo controllando il codice, cercavo un errore solo nel file XML
Mrinmoy

3

Primo progetto pulito, quindi ricostruzione del progetto. Stavo anche affrontando lo stesso problema. Tutto è andato bene dopo questo.


2

Se tutto il resto fallisce, apri il file in binario per assicurarti che non ci siano caratteri divertenti [3 caratteri non stampabili all'inizio del file che identificano il file come utf-8] all'inizio del file. Abbiamo fatto questo e ne abbiamo trovati alcuni. quindi abbiamo convertito il file da utf-8 a ascii e ha funzionato.


2

Per gli stessi problemi, ho rimosso la seguente riga,

  File file = new File("c:\\file.xml");
  InputStream inputStream= new FileInputStream(file);
  Reader reader = new InputStreamReader(inputStream,"UTF-8");
  InputSource is = new InputSource(reader);
  is.setEncoding("UTF-8");

Funziona benissimo. Non sono sicuro del perché quell'UTF-8 dia problemi. Per tenermi sotto shock, funziona bene anche con UTF-8.

Sto usando Windows 7 a 32 bit e Netbeans IDE con Java * jdk1.6.0_13 *. Non ho idea di come funzioni.


2

Come Mike Sokolov ha già sottolineato, uno dei possibili motivi è la presenza di alcuni personaggi (come uno spazio) prima del tag.

Se l'XML di input viene letto come stringa (al contrario dell'array di byte), è possibile utilizzare sostituire la stringa di input con il codice seguente per assicurarsi che tutti i caratteri "non necessari" prima di cancellare il tag xml.

inputXML=inputXML.substring(inputXML.indexOf("<?xml"));

Tuttavia, devi essere sicuro che l'input xml inizi con il tag xml.


2

Nel mio caso il web.xml nella mia applicazione ha spazio extra anche dopo che ho cancellato non ha funzionato ho dovuto ripristinare gli chages e le sue correzioni e sì stavo giocando con logging.properties e web.xml nel mio tomcat ma anche dopo aver ripristinato il l'errore ha continuato a mostrare, quindi questo risolto)).

spazio extra

Per essere precisi, ho provato a fare l'aggiunta di org.apache.catalina.filters.ExpiresFilter.level = Stack FINE over flow qualcosa su logging.properties


1

Ho seguito le istruzioni trovate qui e ho avuto lo stesso errore.

Ho provato diverse cose per risolverlo (cioè cambiando la codifica, digitando il file XML invece di incollarlo ect) in Notepad e XML Notepad ma niente ha funzionato.

Il problema è stato risolto quando ho modificato e salvato il mio file XML in Notepad ++ (codifica -> utf-8 senza BOM)


1

Per tutti quelli che ottengono questo errore: ATTENZIONE: Catalina.start usando conf / server.xml: il contenuto non è consentito in prolog.

Non molto informativo .. ma ciò che ciò significa in realtà è che c'è immondizia nel tuo file conf / server.xml.

Ho visto questo errore esatto in altri file XML .. questo errore può essere causato modificando un editor di testo che introduce la spazzatura.

Il modo in cui è possibile verificare se nel file è presente immondizia è aprirlo con un "editor esadecimale" Se viene visualizzato un carattere prima di questa stringa

     "<?xml version="1.0" encoding="UTF-8"?>"

come questo sarebbe spazzatura

     "‰ŠŒ<?xml version="1.0" encoding="UTF-8"?>"

questo è il tuo problema .... La soluzione è usare un buon editor esadecimale .. Uno che ti permetterà di salvare file con diversi tipi di codifica ..

Quindi salvalo come UTF-8. Alcuni sistemi che utilizzano file XML potrebbero averne bisogno come UTF NO BOM, che significa "NO Byte Order Mark"

Spero che questo aiuti qualcuno là fuori !!



1

Per risolvere il problema della distinta componenti su sistemi Unix / Linux:

  1. Controlla se c'è un carattere BOM indesiderato: hexdump -C myfile.xml | more un carattere BOM indesiderato verrà visualizzato all'inizio del file come...<?xml>

  2. In alternativa, fallo file myfile.xml. Un file con un carattere DBA apparirà come:myfile.xml: XML 1.0 document text, UTF-8 Unicode (with BOM) text

  3. Correggi un singolo file con: tail -c +4 myfile.xml > temp.xml && mv temp.xml myfile.xml

  4. Ripeti 1 o 2 per verificare che il file sia stato disinfettato. Probabilmente anche ragionevole fare view myfile.xmlper verificare che i contenuti siano rimasti.

Ecco uno script bash per disinfettare un'intera cartella di file XML:

#!/usr/bin/env bash

# This script is to sanitise XML files to remove any BOM characters

has_bom() { head -c3 "$1" | LC_ALL=C grep -qe '\xef\xbb\xbf'; }

for filename in *.xml ; do
  if has_bom ${filename}; then
    tail -c +4 ${filename} > temp.xml
    mv temp.xml ${filename}
  fi
done

0

Solo un ulteriore pensiero su questo per il futuro. Ottenere questo errore potrebbe essere il caso in cui si preme semplicemente la chiave di eliminazione o un'altra chiave in modo casuale quando hanno una finestra XML come display attivo e non prestano attenzione. Questo mi è successo prima con il file struts.xml nella mia applicazione web. Gomiti goffi ...


Mi sono assicurato di non premere alcun tasto
Mad-D

0

Stavo anche ottenendo lo stesso

XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,2] Message: Reference is not allowed in prolog.

, quando la mia applicazione stava creando una risposta XML per una chiamata Webservice RestFull. Durante la creazione del formato XML String ho sostituito & lt e & gt con <e> quindi l'errore si è spento e ho ricevuto la risposta corretta. Non sono sicuro di come abbia funzionato, ma ha funzionato.

campione :

String body = "<ns:addNumbersResponse xmlns:ns=\"http://java.duke.org\"><ns:return>"
            +sum
            +"</ns:return></ns:addNumbersResponse>";

0

Ho avuto lo stesso problema.

Innanzitutto ho scaricato il file XML sul desktop locale e l'ho ottenuto Content is not allowed in prologdurante l'importazione del file sul server portale. Anche visivamente il file mi stava bene ma in qualche modo è stato danneggiato.

Quindi ho scaricato nuovamente lo stesso file e provato lo stesso e ha funzionato.


0

Abbiamo avuto lo stesso problema di recente e si è rivelato essere il caso di un URL non valido e di conseguenza di una risposta HTTP 403 standard (che ovviamente non è l'XML valido che il client stava cercando). Ho intenzione di condividere i dettagli nel caso in cui qualcuno nello stesso contesto si imbatta in questo problema:

Questa era un'applicazione web basata su Spring in cui un bean "JaxWsPortProxyFactoryBean" era configurato per esporre un proxy per una porta remota.

<bean id="ourPortJaxProxyService"
    class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"
    p:serviceInterface="com.amir.OurServiceSoapPortWs"
    p:wsdlDocumentUrl="${END_POINT_BASE_URL}/OurService?wsdl"
    p:namespaceUri="http://amir.com/jaxws" p:serviceName="OurService"
    p:portName="OurSoapPort" />

"END_POINT_BASE_URL" è una variabile di ambiente configurata in "setenv.sh" dell'istanza Tomcat che ospita l'applicazione Web. Il contenuto del file è simile al seguente:

export END_POINT_BASE_URL="http://localhost:9001/BusinessAppServices"
#export END_POINT_BASE_URL="http://localhost:8765/BusinessAppServices"

Lo scomparso ";" dopo ogni riga ha causato l'URL non valido e quindi la cattiva risposta. Cioè, invece di "BusinessAppServices / OurService? Wsdl" l'URL aveva un CR prima di "/". "TCP / IP Monitor" è stato molto utile durante la risoluzione del problema.


0

Nel mio caso ho riscontrato questo errore perché l'API che ho usato potrebbe restituire i dati in formato XML o JSON. Quando l'ho testato usando un browser, è passato al formato XML, ma quando ho invocato la stessa chiamata da un'applicazione Java, l'API ha restituito la risposta formattata JSON, che ha innescato naturalmente un errore di analisi.


0

Anche io avevo affrontato un problema simile. Il motivo era un po 'di immondizia all'inizio del file.

Correzione: basta aprire il file in un editor di testo (testato su testo Sublime) rimuovere qualsiasi rientro nel file e copiare incollare tutto il contenuto del file in un nuovo file e salvarlo. Questo è tutto!. Quando ho eseguito il nuovo file è stato eseguito senza errori di analisi.


0

Ho preso il codice di Dineshkumar e modificato per convalidare correttamente il mio file XML:

import org.apache.log4j.Logger;

public class Myclass{

private static final Logger LOGGER = Logger.getLogger(Myclass.class);

/**
 * Validate XML file against Schemas XSD in pathEsquema directory
 * @param pathEsquema directory that contains XSD Schemas to validate
 * @param pathFileXML XML file to validate
 * @throws BusinessException if it throws any Exception
 */
public static void validarXML(String pathEsquema, String pathFileXML) 
	throws BusinessException{	
	String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
	String nameFileXSD = "file.xsd";
	String MY_SCHEMA1 = pathEsquema+nameFileXSD);
	ParserErrorHandler parserErrorHandler;
	try{
		SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA);
		
		Source [] source = { 
			new StreamSource(new File(MY_SCHEMA1))
			};
		Schema schemaGrammar = schemaFactory.newSchema(source);

		Validator schemaValidator = schemaGrammar.newValidator();
		schemaValidator.setErrorHandler(
			parserErrorHandler= new ParserErrorHandler());
		
		/** validate xml instance against the grammar. */
		File file = new File(pathFileXML);
		InputStream isS= new FileInputStream(file);
		Reader reader = new InputStreamReader(isS,"UTF-8");
		schemaValidator.validate(new StreamSource(reader));
		
		if(parserErrorHandler.getErrorHandler().isEmpty()&& 
			parserErrorHandler.getFatalErrorHandler().isEmpty()){
			if(!parserErrorHandler.getWarningHandler().isEmpty()){
				LOGGER.info(
				String.format("WARNING validate XML:[%s] Descripcion:[%s]",
					pathFileXML,parserErrorHandler.getWarningHandler()));
			}else{
				LOGGER.info(
				String.format("OK validate  XML:[%s]",
					pathFileXML));
			}
		}else{
			throw new BusinessException(
				String.format("Error validate  XML:[%s], FatalError:[%s], Error:[%s]",
				pathFileXML,
				parserErrorHandler.getFatalErrorHandler(),
				parserErrorHandler.getErrorHandler()));
		}		
	}
	catch(SAXParseException e){
		throw new BusinessException(String.format("Error validate XML:[%s], SAXParseException:[%s]",
			pathFileXML,e.getMessage()),e);
	}
	catch (SAXException e){
		throw new BusinessException(String.format("Error validate XML:[%s], SAXException:[%s]",
			pathFileXML,e.getMessage()),e);
	}
	catch (IOException e) {
		throw new BusinessException(String.format("Error validate XML:[%s], 
			IOException:[%s]",pathFileXML,e.getMessage()),e);
	}
	
}

}


0

Imposta il tuo documento in modo che si formi così:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    %children%
</root>

0

Ho avuto lo stesso problema con la primavera

MarshallingMessageConverter

e per codice pre-processo.

Forse qualcuno avrà bisogno di un motivo: BytesMessage #readBytes - lettura dei byte .. e ho dimenticato che la lettura è un'operazione in una direzione. Non puoi leggere due volte.


0

Prova con BOMInputStream in apache.commons.io:

public static <T> T getContent(Class<T> instance, SchemaType schemaType, InputStream stream) throws JAXBException, SAXException, IOException {

    JAXBContext context = JAXBContext.newInstance(instance);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    Reader reader = new InputStreamReader(new BOMInputStream(stream), "UTF-8");

    JAXBElement<T> entry = unmarshaller.unmarshal(new StreamSource(reader), instance);

    return entry.getValue();
}

0

Stavo avendo lo stesso problema durante l'analisi del info.plistfile nel mio mac. Tuttavia, il problema è stato risolto utilizzando il seguente comando che ha trasformato il file in un XML.

plutil -convert xml1 info.plist

Spero che aiuti qualcuno.


0

Ho avuto lo stesso problema con alcuni file XML, ho risolto la lettura del file con codifica ANSI (Windows-1252) e la scrittura di un file con codifica UTF-8 con un piccolo script in Python. Ho provato a usare Notepad ++ ma non ho avuto successo:

import os
import sys

path = os.path.dirname(__file__)

file_name = 'my_input_file.xml'

if __name__ == "__main__":
    with open(os.path.join(path, './' + file_name), 'r', encoding='cp1252') as f1:
        lines = f1.read()
        f2 = open(os.path.join(path, './' + 'my_output_file.xml'), 'w', encoding='utf-8')
        f2.write(lines)
        f2.close()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.