Я бил головой об этой абсолютно бешеной ошибке за последние 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, и т.д. Я посмотрел на это побайтовое число в массиве для байтов-ордеров или что-то в этом роде, Ничего; он проходит каждый тест проверки, который я мог бы набросить на него. Даже незнакомец, это случается, если я использую саксонский синтаксический анализатор, а также, но ТОЛЬКО на GAE, он всегда отлично работает в моей локальной среде.
Это очень сложно отследить код для проблем, когда я могу запускать отладчик только в среде, которая отлично работает (я не нашел хорошего способа удаленно отлаживать GAE). Тем не менее, используя примитивные средства, которые у меня есть, я пробовал миллион подходов, включая:
- XML с прологом и без него
- С новостями и без них
- С атрибутом "encoding =" и без него в прологе
- Оба стиля новой строки
- С информацией об каналах, присутствующей в потоке HTTP, и без нее
И я пробовал большинство из них в нескольких комбинациях, где было разумно, что они будут взаимодействовать - ничего! Я нахожусь на своем остроумном конце. Кто-нибудь видел такую проблему, прежде чем это может надеяться пролить свет на нее?
Спасибо!