Я бился головой об этой ужасной ошибке последние 48 часов, так что я подумал, что наконец-то выброшу полотенце и попробую спросить здесь, прежде чем выбросить свой ноутбук в окно.
Я пытаюсь разобрать ответ XML на вызов, сделанный мной в AWS SimpleDB. Ответ возвращается по проводу нормально; например, это может выглядеть так:
<?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>
Я передаю этот XML парсеру с
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
и звоню eventReader.nextEvent();
несколько раз, чтобы получить нужные мне данные.
Вот что интересно - он отлично работает на локальном сервере. Приходит ответ, разбираю, все довольны. Проблема в том, что когда я развертываю код в Google App Engine, исходящий запрос все еще работает, и ответ XML кажется мне на 100% идентичным и правильным, но ответ не удается проанализировать со следующим исключением:
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)
Я дважды, трижды, четыре раза проверял этот XML на наличие «невидимых символов» или символов, не закодированных в UTF8, и т. Д. Я смотрел его побайтово в массиве для отметок порядка байтов или чего-то в этом роде. Ничего; он проходит все проверочные тесты, которые я мог ему предложить. Что еще более странно, это случается, если я использую синтаксический анализатор на основе Saxon, но ТОЛЬКО на GAE он всегда отлично работает в моей локальной среде.
Это очень затрудняет отслеживание кода проблем, когда я могу запустить отладчик только в среде, которая работает идеально (я не нашел хорошего способа удаленной отладки в GAE). Тем не менее, используя имеющиеся у меня примитивные средства, я испробовал миллион подходов, в том числе:
- XML с прологом и без него
- С символами новой строки и без них
- С атрибутом encoding = и без него в прологе
- Оба стиля новой строки
- С и без информации о фрагментах, присутствующей в потоке HTTP
И я пробовал большинство из них в нескольких комбинациях, где имело смысл их взаимодействие - ничего! Я на грани своего остроумия. Кто-нибудь видел подобную проблему раньше, которая, надеюсь, может пролить на нее свет?
Спасибо!