Последние 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
И я попробовал большинство из них в нескольких комбинациях, где имело смысл, что они будут взаимодействовать - ничего! Я в конце своего остроумия. Кто-нибудь видел проблему, подобную этой, до этого, мы надеемся, пролить свет на это?
Спасибо!