Przez ostatnie 48 godzin waliłem głową w ten absolutnie irytujący błąd, więc pomyślałem, że w końcu rzucę ręcznik i spróbuję zapytać tutaj, zanim wyrzucę laptopa przez okno.
Próbuję przeanalizować XML odpowiedzi z połączenia, które wykonałem do AWS SimpleDB. Odpowiedź wraca na drut w porządku; na przykład może wyglądać tak:
<?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>
Przekazuję ten XML do parsera z
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
i dzwonię eventReader.nextEvent();
kilka razy, aby uzyskać potrzebne dane.
Oto dziwna część - działa świetnie na lokalnym serwerze. Nadchodzi odpowiedź, analizuję ją, wszyscy są szczęśliwi. Problem polega na tym, że kiedy wdrażam kod w Google App Engine, żądanie wychodzące nadal działa, a XML odpowiedzi wydaje mi się w 100% identyczny i poprawny, ale odpowiedź nie jest analizowana z następującym wyjątkiem:
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)
Podwójnie, potrójnie, poczwórnie sprawdziłem ten XML pod kątem „niewidocznych znaków” lub znaków zakodowanych w formacie innym niż UTF8 itp. Spojrzałem na to bajt po bajcie w tablicy pod kątem znaków kolejności bajtów lub czegoś w tym rodzaju. Nic; przechodzi wszystkie testy walidacyjne, jakie mogłem mu rzucić. Co dziwniejsze, dzieje się tak, gdy używam również parsera opartego na Saksonii - ale TYLKO w GAE, zawsze działa dobrze w moim lokalnym środowisku.
Utrudnia to śledzenie kodu pod kątem problemów, gdy mogę uruchomić debugger tylko w środowisku, które działa idealnie (nie znalazłem żadnego dobrego sposobu na zdalne debugowanie w GAE). Niemniej jednak, używając prymitywnych środków, które posiadam, wypróbowałem milion podejść, w tym:
- XML z prologiem i bez niego
- Z nowymi liniami i bez
- Z atrybutem „encoding =” w prologu i bez niego
- Oba style nowej linii
- Z i bez informacji o porcjowaniu obecnych w strumieniu HTTP
Wypróbowałem większość z nich w wielu kombinacjach, w których miało sens, aby wchodziły w interakcje - nic! Jestem na końcu mojego dowcipu. Czy ktoś widział wcześniej taki problem, który, miejmy nadzieję, może rzucić na to trochę światła?
Dzięki!