Son 48 saattir bu kesinlikle çileden çıkaran böceğe karşı kafamı dövüyordum, bu yüzden sonunda havluyu atıp dizüstü bilgisayarımı pencereden atmadan önce burada sormayı deneyeceğimi düşündüm.
AWS SimpleDB'ye yaptığım bir çağrıdaki yanıt XML'sini ayrıştırmaya çalışıyorum. Cevap tele gayet iyi geliyor; örneğin şöyle görünebilir:
<?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>
Bu XML'yi bir ayrıştırıcıya iletiyorum
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
ve eventReader.nextEvent();
istediğim verileri almak için birkaç kez arayın .
İşte tuhaf kısım - yerel sunucu içinde harika çalışıyor. Cevap geliyor, ayrıştırıyorum, herkes mutlu. Sorun şu ki, kodu Google App Engine'e dağıttığımda, giden istek hala çalışıyor ve yanıt XML benim için% 100 aynı ve doğru görünüyor, ancak yanıt aşağıdaki istisna ile ayrıştırılamıyor:
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)
Bu XML'de 'görünmez karakterler' veya UTF8 olmayan kodlanmış karakterler, vb. İçin çift, üçlü, dörtlü kontrol ettim. Bayt sıra işaretleri veya bu türden bir şey için bir dizide bayt bayt'a baktım. Hiçbir şey değil; atabileceğim her doğrulama testini geçti. Daha da garip, Sakson tabanlı bir ayrıştırıcı kullanırsam da olur - ancak YALNIZCA GAE'de, yerel ortamımda her zaman iyi çalışır.
Hata ayıklayıcıyı yalnızca mükemmel şekilde çalışan bir ortamda çalıştırabildiğimde (GAE'de uzaktan hata ayıklamanın iyi bir yolunu bulamadım) sorunlara yönelik kodu izlemeyi çok zorlaştırıyor. Yine de, sahip olduğum ilkel araçları kullanarak, aşağıdakileri içeren bir milyon yaklaşım denedim:
- Prolog içeren ve içermeyen XML
- Satırsonu olan ve olmayan
- Prologdaki "encoding =" özelliği olsun veya olmasın
- Her iki satırsonu stili
- HTTP akışında bulunan yığın bilgileri varken ve yokken
Ve bunların çoğunu, etkileşim kuracaklarının mantıklı olduğu çoklu kombinasyonlarda denedim - hiçbir şey! Aklımın sonundayım. Daha önce böyle bir sorunu gören var mı, umarım bu konuya biraz ışık tutabilir mi?
Teşekkürler!