Ho battuto la testa contro questo bug assolutamente esasperante nelle ultime 48 ore, quindi ho pensato di gettare la spugna e provare a chiedere qui prima di gettare il mio laptop dalla finestra.
Sto cercando di analizzare l'XML di risposta da una chiamata che ho effettuato ad AWS SimpleDB. La risposta sta tornando sul filo più che bene; ad esempio, potrebbe essere simile a:
<?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>
Passo questo XML a un parser con
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
e chiamare eventReader.nextEvent();
un sacco di volte per ottenere i dati che desidero.
Ecco la parte bizzarra: funziona benissimo all'interno del server locale. La risposta arriva, lo analizzo, tutti sono felici. Il problema è che quando distribuisco il codice su Google App Engine, la richiesta in uscita funziona ancora e l'XML di risposta mi sembra identico e corretto al 100%, ma la risposta non viene analizzata con la seguente eccezione:
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)
Ho controllato due volte, tre volte, quadruplicare questo XML per "caratteri invisibili" o caratteri non codificati UTF8, ecc. L'ho guardato byte per byte in un array per i segni dell'ordine dei byte o qualcosa del genere. Niente; supera tutti i test di convalida che potrei lanciargli. Ancora più strano, succede se utilizzo anche un parser basato su Saxon - ma SOLO su GAE, funziona sempre bene nel mio ambiente locale.
Rende molto difficile tracciare il codice per i problemi quando posso eseguire il debugger solo su un ambiente che funziona perfettamente (non ho trovato alcun buon modo per eseguire il debug remoto su GAE). Tuttavia, utilizzando i mezzi primitivi che ho, ho provato un milione di approcci tra cui:
- XML con e senza prologo
- Con e senza newline
- Con e senza l'attributo "encoding =" nel prologo
- Entrambi gli stili di nuova riga
- Con e senza le informazioni di chunking presenti nel flusso HTTP
E ho provato la maggior parte di questi in più combinazioni in cui aveva senso che interagissero - niente! Sono alla fine del mio ingegno. Qualcuno ha mai visto un problema come questo prima che si spera possa far luce su di esso?
Grazie!