"Inhalt ist in Prolog nicht erlaubt", wenn perfekt gültiges XML auf GAE analysiert wird
Ich habe gegen mein Kopf gegen diese absolut ärgerlich bug für die letzten 48 Stunden, so dass ich dachte, ich würde endlich das Handtuch werfen und versuchen, die Frage hier, bevor ich werfe meinen laptop aus dem Fenster.
Ich versuche zum Parsen der XML-Antwort von einem Anruf, den ich an AWS SimpleDB. Die Antwort kommt zurück auf den Draht einfach in Ordnung; es kann zum Beispiel so Aussehen:
<?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>
Ich pass in diese XML einen parser mit
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
- und call - eventReader.nextEvent();
ein paar mal um die Daten die ich möchte.
Hier ist der bizarre Teil-es funktioniert innerhalb der lokalen server. Die Antwort kommt, ich parse es, jeder ist glücklich. Das problem ist, dass wenn ich implementieren Sie den code für Google App Engine, die ausgehende Anforderung funktioniert immer noch, und die XML-Antwort scheint zu 100% identisch und korrekt zu mir, aber die Resonanz ausfällt, um zu analysieren, mit der folgenden Ausnahme:
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)
Ich haben Doppel -, Dreibett -, Vierbettzimmer überprüft das XML-für die 'unsichtbare Zeichen' oder nicht-UTF8-codierte Zeichen, etc. Ich sah Sie an byte-by-byte in ein array für die byte-order-Mark oder etwas in der Natur. Nichts, es geht jeder Validierung test ich konnte um sich werfen. Noch seltsamer, es passiert, wenn ich eine Saxon-basierte parser wie auch -- aber NUR auf GAE, ist es immer gut funktioniert in meiner lokalen Umgebung.
Macht es sehr schwierig zu verfolgen, die code für Probleme, wenn ich nur den debugger auf eine Umgebung, die perfekt funktioniert (ich habe nicht gefunden, eine gute Möglichkeit zur Remote-Debuggen auf GAE). Dennoch, mit den primitiven Mitteln, die ich habe, habe ich versucht, eine Millionen Ansätze, darunter:
- XML mit und ohne prolog
- Mit und ohne Zeilenumbrüche
- Mit und ohne "encoding=" Attribut im prolog
- Beide newline-Stile
- Mit und ohne chunking Informationen in den HTTP-stream
Und ich habe versucht, die meisten dieser in mehreren Kombinationen, wo es Sinn machte, Sie interagieren würden-nichts! Ich bin mit meinem Latein am Ende. Hat jemand gesehen ein Problem wie dieses, bevor, die hoffentlich etwas Licht auf Sie?
Dank!
InformationsquelleAutor der Frage Adrian Petrescu | 2010-06-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das encoding in XML-und XSD (oder DTD) unterschiedlich sind.
XML-Datei-header:
<?xml version='1.0' encoding='utf-8'?>
XSD-Datei-header:
<?xml version='1.0' encoding='utf-16'?>
Ein anderes mögliches Szenario, bei dem dieses ist, wenn alles kommt, bevor das XML-Dokument-Typ-Deklaration. ich.e haben Sie vielleicht so etwas wie dies in den Puffer:
oder sogar ein Leerzeichen oder ein Sonderzeichen.
Gibt es einige speziellen Zeichen, den sogenannten byte-order-Marker, konnte in den Puffer.
Vor der übergabe des Puffers an den Parser dies tun...
InformationsquelleAutor der Antwort Romain Hippeau
Diese Fehlermeldung ist immer verursacht durch die ungültige XML-Inhalte in der Anfang element. Zum Beispiel, extra kleine Punkt "." am Anfang des XML-Elements.
Alle Zeichen vor dem "
<?xml….
" verursachen oben "org.xml.sax.SAXParseException: Content is not allowed in prolog" Fehlermeldung.Einen kleinen Punkt "." vor der
“<?xml….
Um es zu beheben, löschen Sie einfach alle diese komischen Zeichen vor der
“<?xml“
.Ref: http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/
InformationsquelleAutor der Antwort Sunmit Girme
War ich vor dem gleichen Problem. In meinem Fall XML-Dateien generiert wurden, aus c# - Programm und gefüttert in AS400 für die weitere Verarbeitung. Nach einigen Analysen festgestellt, dass ich mit UTF8-Codierung bei der Erzeugung der XML-Dateien in der Erwägung, dass javac(AS400) verwendet "UTF8 ohne BOM".
So, hatte zu schreiben zusätzlichen code wie unten erwähnt:
InformationsquelleAutor der Antwort Saturn CAU
In meiner xml-Datei, die header wie folgt aussah:
In einer test-Datei, ich war das Lesen der Datei-bytes und die Dekodierung der Daten als UTF-8 (nicht-erkennen der header in dieser Datei war im utf-16), um eine Zeichenfolge erstellen.
Wenn ich versuchte, Sie zu Deserialisieren diesen string in ein Objekt, sah ich den gleichen Fehler:
Wenn ich aktualisiert, in der zweiten Zeile zu
War ich in der Lage zu Deserialisieren das Objekt einfach nur gut. So wie Romain hatte oben erwähnt, ist die Codierungen übereinstimmen müssen.
InformationsquelleAutor der Antwort dfritch
Ich Stand vor dem gleichen problem namens "Content is not allowed in prolog" in meiner xml-Datei.
Lösung
Zunächst mein root-Ordner wurde '#mit dem Namen'.
Wenn ich entfernt das erste Zeichen '#' ,wird der Fehler gelöst habe.
Keine Notwendigkeit, das entfernen der #filename...
Versuchen Sie, in dieser Weise..
Statt der übergabe eines Datei-oder URL-Objekt, um den unmarshaller-Methode, verwenden Sie einen FileInputStream.
InformationsquelleAutor der Antwort Ravi Kiran
Hatte ich ein tab-Zeichen anstelle von Leerzeichen.
Ersetzen Sie den Tabulator '\t' das problem behoben.
Ausschneiden und einfügen das gesamte Dokument in einem editor wie Notepad++ und Anzeige aller Zeichen.
InformationsquelleAutor der Antwort SoloPilot
In meinem Beispiel das problem, die Lösung war das ersetzen der deutschen Umlaute (äöü) durch Ihre HTML-Entsprechungen...
InformationsquelleAutor der Antwort MBaas
unten sind Ursache oben “org.xml.sax.SAXParseException: Content is not allowed in prolog" Ausnahme.
XML-Datei-header:
<?xml version='1.0' encoding='utf-8'?>
XSD-Datei-header:
<?xml version='1.0' encoding='utf-8'?>
hello<?xml version='1.0' encoding='utf-16'?>
InformationsquelleAutor der Antwort Avinash Dubey
In meinem Fall, ich hatte das problem mit einem
build.xml
- Datei. Dies wurde gelöst, mit nur zuBuild > Clean Project
.InformationsquelleAutor der Antwort Muz
In den Geist von "nur löschen, alle diese komischen Zeichen vor dem <?xml", hier mein Java-code, der funktioniert auch mit der Eingabe über einen BufferedReader:
FWIW, die bytes, die ich sah, sind (in dezimal): 239, 187, 191.
InformationsquelleAutor der Antwort Tamias