Saya telah memukuli kepala saya terhadap bug yang benar-benar menyebalkan ini selama 48 jam terakhir, jadi saya pikir akhirnya saya menyerah dan mencoba bertanya di sini sebelum saya membuang laptop saya ke luar jendela.
Saya mencoba mengurai XML tanggapan dari panggilan yang saya lakukan ke AWS SimpleDB. Tanggapannya datang kembali dengan baik; misalnya, mungkin terlihat seperti:
<?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>
Saya mengirimkan XML ini ke parser dengan
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
dan menelepon eventReader.nextEvent();
berkali-kali untuk mendapatkan data yang saya inginkan.
Inilah bagian yang aneh - ini berfungsi dengan baik di dalam server lokal. Tanggapannya masuk, saya parse, semua orang senang. Masalahnya adalah saat saya menerapkan kode ke Google App Engine, permintaan keluar masih berfungsi, dan XML responsnya tampak 100% identik dan benar bagi saya, tetapi respons gagal diurai dengan pengecualian berikut:
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)
Saya memiliki double, triple, quadruple memeriksa XML ini untuk 'karakter tak terlihat' atau karakter non-UTF8 yang dikodekan, dll. Saya melihatnya byte-by-byte dalam array untuk byte-order-marks atau sesuatu yang bersifat seperti itu. Tidak ada; itu melewati setiap tes validasi yang bisa saya lakukan. Lebih aneh lagi, itu terjadi jika saya juga menggunakan parser berbasis Saxon - tetapi HANYA pada GAE, ini selalu berfungsi dengan baik di lingkungan lokal saya.
Itu membuat sangat sulit untuk melacak kode untuk masalah ketika saya hanya dapat menjalankan debugger di lingkungan yang bekerja dengan sempurna (saya belum menemukan cara yang baik untuk men-debug dari jarak jauh di GAE). Namun demikian, dengan menggunakan cara primitif yang saya miliki, saya telah mencoba jutaan pendekatan termasuk:
- XML dengan dan tanpa prolog
- Dengan dan tanpa baris baru
- Dengan dan tanpa atribut "encoding =" di prolog
- Keduanya gaya baris baru
- Dengan dan tanpa informasi chunking yang ada di aliran HTTP
Dan saya sudah mencoba sebagian besar dari ini dalam berbagai kombinasi yang masuk akal jika mereka berinteraksi - tidak ada! Aku kehabisan akal. Adakah yang pernah melihat masalah seperti ini sebelumnya yang semoga dapat menjelaskannya?
Terima kasih!