Ich habe in den letzten 48 Stunden meinen Kopf gegen diesen absolut wütenden 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 von einem Aufruf an AWS SimpleDB zu analysieren. Die Antwort kommt ganz gut auf den Draht zurück; Zum Beispiel könnte 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 rufe eventReader.nextEvent();
ein paar Mal an, um die gewünschten Daten zu erhalten.
Hier ist der bizarre Teil - er funktioniert hervorragend auf dem lokalen Server. Die Antwort kommt herein, ich analysiere sie, alle sind glücklich. Das Problem ist, dass beim Bereitstellen des Codes in Google App Engine die ausgehende Anforderung weiterhin funktioniert und die Antwort-XML für mich zu 100% identisch und korrekt erscheint, die Antwort jedoch mit der folgenden Ausnahme nicht analysiert werden kann:
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-codierte Zeichen usw. überprüft. Ich habe es Byte für Byte in einem Array auf Bytereihenfolge-Markierungen oder ähnliches untersucht. Nichts; Es besteht jeden Validierungstest, den ich durchführen könnte. Noch seltsamer ist es, wenn ich auch einen sächsischen Parser verwende - aber NUR auf GAE funktioniert es in meiner lokalen Umgebung immer einwandfrei.
Es macht es sehr schwierig, den Code auf Probleme zu verfolgen, wenn ich den Debugger nur in einer Umgebung ausführen kann, die perfekt funktioniert (ich habe keine gute Möglichkeit gefunden, auf GAE remote zu debuggen). Trotzdem habe ich mit den primitiven Mitteln, die ich habe, eine Million Ansätze ausprobiert, darunter:
- XML mit und ohne Prolog
- Mit und ohne Zeilenumbruch
- Mit und ohne das Attribut "encoding =" im Prolog
- Beide Newline-Stile
- Mit und ohne die im HTTP-Stream vorhandenen Chunking-Informationen
Und ich habe die meisten davon in mehreren Kombinationen ausprobiert, bei denen es Sinn machte, dass sie interagieren würden - nichts! Ich bin mit meinem Latein am Ende. Hat jemand schon einmal ein Problem wie dieses gesehen, das hoffentlich etwas Licht ins Dunkel bringen kann?
Vielen Dank!