it-swarm.com.de

"Inhalt ist im Prolog nicht zulässig", wenn einwandfrei gültiges XML in GAE analysiert wird

Ich habe die letzten 48 Stunden meinen Kopf gegen diesen absolut nervenaufreibenden Käfer geschlagen, also dachte ich, ich würde endlich das Handtuch werfen und versuchen, hier zu fragen, bevor ich meinen Laptop aus dem Fenster schmeiße.

Ich versuche, die Antwort-XML eines Anrufs zu analysieren, den ich an AWS SimpleDB gerichtet habe. Die Antwort kommt gut auf dem Drahtseil zurück; Zum Beispiel kann es 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 übergebe dieses XML an einen Parser mit 

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

und rufen Sie eventReader.nextEvent(); ein paar Mal auf, um die gewünschten Daten zu erhalten.

Hier ist der bizarre Teil - er funktioniert hervorragend auf dem lokalen Server. Die Antwort kommt rein, ich analysiere es, alle sind glücklich. Das Problem ist, dass bei der Bereitstellung des Codes für Google App Engine die ausgehende Anforderung weiterhin funktioniert und die Antwort-XML für mich zu 100% identisch und korrekt erscheint. Die Antwort kann jedoch nicht mit der folgenden Ausnahme analysiert werden:

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 habe dieses XML doppelt, dreifach, vierfach auf 'unsichtbare Zeichen' oder nicht-UTF8-kodierte Zeichen usw. überprüft. Ich habe es byteweise in einem Array auf Byte-Reihenfolge-Markierungen oder etwas ähnliches untersucht. Nichts; es besteht jeden Validierungstest, den ich darauf werfen konnte. Sogar ein Fremder, es passiert, wenn ich auch einen sächsischen Parser verwende - aber NUR bei GAE funktioniert es in meiner Umgebung immer gut.

Es ist sehr schwierig, den Code für Probleme aufzuspüren, wenn ich den Debugger nur in einer Umgebung ausführen kann, die perfekt funktioniert (ich habe keine gute Möglichkeit gefunden, auf GAE aus der Ferne zu debuggen). Trotzdem habe ich mit meinen primitiven Mitteln eine Million Ansätze ausprobiert, darunter:

  • XML mit und ohne Prolog
  • Mit und ohne Zeilenumbrüche
  • Mit und ohne das Attribut "coding =" im Prolog
  • Beide Newline-Styles
  • Mit und ohne die im HTTP-Stream vorhandenen Chunking-Informationen

Ich habe die meisten davon in mehreren Kombinationen ausprobiert, bei denen es sinnvoll war, dass sie miteinander interagieren würden - nichts! Ich bin mit meinem Latein am Ende. Hat jemand schon ein Problem wie dieses gesehen, das hoffentlich etwas Licht aufkommen lässt?

Vielen Dank!

75
Adrian Petrescu

Die Kodierung in XML und XSD (oder DTD) unterscheidet sich.
XML-Dateiheader: <?xml version='1.0' encoding='utf-8'?>
XSD-Dateiheader: <?xml version='1.0' encoding='utf-16'?>

Ein anderes mögliches Szenario, das dies verursacht, ist, wenn vor der XML-Dokumenttypdeklaration etwas kommt. Das heißt, Sie könnten so etwas im Puffer haben: 

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

oder sogar ein Leerzeichen oder ein Sonderzeichen.

Es gibt einige Sonderzeichen, die als Bytereihenfolge-Markierungen bezeichnet werden, die sich im Puffer befinden könnten. 

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

Diese Fehlermeldung wird immer durch den ungültigen XML-Inhalt im Anfangselement verursacht. Zum Beispiel ein extra kleiner Punkt "." Am Anfang eines XML-Elements.

Alle Zeichen vor dem "<?xml…." verursachen über "org.xml.sax.SAXParseException: Inhalt ist in prolog" keine Fehlermeldung.

Ein kleiner Punkt “. ”Vor dem “<?xml….

Um dies zu beheben, löschen Sie einfach alle seltsamen Zeichen vor dem “<?xml“.

Ref: http://www.mkyong.com/Java/sax-error-content-is-not-allowed-in-prolog/

7
Sunmit Girme

Ich stand vor demselben Problem. In meinem Fall wurden XML-Dateien aus dem Programm c # generiert und zur weiteren Verarbeitung in AS400 eingespeist. Nach einigen Analysen stellte ich fest, dass ich beim Generieren von XML-Dateien die UTF8-Codierung verwendete, wohingegen javac (in AS400) "UTF8 ohne Stückliste" verwendet. Also musste zusätzlicher Code geschrieben werden, der dem unten genannten ähnelt:

//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
5
Saturn CAU

Durch das Entfernen der XML-Deklaration wurde das Problem behoben

<?xml version='1.0' encoding='utf-8'?>
4
F.O.O

In meiner XML-Datei sah der Header folgendermaßen aus: 

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

In einer Testdatei las ich die Dateibytes und dekodierte die Daten als UTF-8 (wobei der Header in dieser Datei nicht utf-16 war), um einen String zu erstellen.

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

Beim Versuch, diese Zeichenfolge in ein Objekt zu deserialisieren, wurde derselbe Fehler angezeigt:

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

Wenn ich die zweite Zeile aktualisiert habe

String dataString = new String(data, "UTF-16");

Ich konnte das Objekt gut deserialisieren. Wie Romain oben bemerkt hatte, müssen die Kodierungen übereinstimmen.

2
dfritch

Ich hatte in meiner XML-Datei das gleiche Problem mit dem Namen "Inhalt ist im Prolog nicht zulässig".

Lösung

Anfangs war mein Stammordner '# Dateiname '.

Wenn ich das erste Zeichen '#' entfernte, wurde der Fehler behoben.

Das Entfernen von #filename ... Ist nicht erforderlich. Versuchen Sie es auf diese Weise. 

Verwenden Sie anstelle eines Datei- oder URL-Objekts an die unmarshaller-Methode einen FileInputStream.

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

Ich hatte ein Problem beim Überprüfen der XML-Datei in Notepad ++ und beim Speichern der Datei, obwohl ich das oberste utf-8-XML-Tag als <?xml version="1.0" encoding="utf-8"?> hatte.

Fixiert durch Speichern der Datei in notpad ++ mit Encoding (Tab)> Encode in UTF-8: ausgewählt (war Encode in UTF-8-BOM)

2
techloris_109

In meinem Fall des Problems bestand die Lösung darin, deutsche Umlaute (äöü) durch ihre HTML-Entsprechungen zu ersetzen.

0
MBaas

Im Sinne von "einfach alle seltsamen Zeichen vor dem <? Xml löschen", hier ist mein Java-Code, der gut mit der Eingabe über einen BufferedReader funktioniert:

    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, die Bytes, die ich sah, sind (in Dezimalzahl): 239, 187, 191.

0
Tamias

In meinem Fall hatte ich das Problem mit einer build.xml-Datei. Dies wurde gelöst, indem einfach zu Build > Clean Project gegangen wurde.

0
Muz

nachfolgend sind die Ursachen oberhalb der Ausnahme "org.xml.sax.SAXParseException: Inhalt ist in Prolog nicht zulässig".

  1. Überprüfen Sie zunächst den Dateipfad von schema.xsd und file.xml.
  2. Die Kodierung in XML und XSD (oder DTD) sollte identisch sein.
    XML-Dateiheader: <?xml version='1.0' encoding='utf-8'?>
    XSD-Dateiheader: <?xml version='1.0' encoding='utf-8'?>
  3. wenn etwas vor dem XML-Dokumenttyp Deklaration.i.e steht: hello<?xml version='1.0' encoding='utf-16'?>
0
Avinash Dubey

Unerwarteter Grund: # Zeichen im Dateipfad

Aufgrund eines internen Fehlers ist der FehlerContent in prolognicht zulässig, wenn der Dateiinhalt selbst zu 100% korrekt ist, Sie jedoch den Dateinamen wie C:\Data\#22\file.xml angeben.

Dies kann möglicherweise auch für andere Sonderzeichen gelten.

Wie zu prüfen: Wenn Sie Ihre Datei in einen Pfad ohne Sonderzeichen verschieben und der Fehler nicht mehr angezeigt wird, war dies das Problem.

0
miroxlav

Ich hatte ein Tabulatorzeichen anstelle von Leerzeichen . Das Ersetzen des Tabulators '\ t' hat das Problem behoben.

Schneiden Sie das gesamte Dokument aus und fügen Sie es in einen Editor wie Notepad ++ ein. Zeigen Sie alle Zeichen an.

0
SoloPilot