Я бил головой об эту абсолютно приводящую в бешенство ошибку в течение прошлых 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 на 'невидимые символы', или non-UTF8 закодировал символы и т.д. Я посмотрел на него байт байтом в массиве для меток порядка байтов или чего-то вроде той природы.Ничего; это передает каждую валидацию, которую я мог бросить в него. Еще более странный, это происходит, если я использую Основанный на саксе синтаксический анализатор также - но ТОЛЬКО на GAE, это всегда хорошо работает в моем окружении.
Это делает его очень трудно для трассировки кода для проблем, когда я могу только выполнить отладчик на среде, которая работает отлично (я не нашел хорошего способа удаленно отладить на GAE). Тем не менее, использование примитивных средств, которые я имею, я попробовал миллион подходов включая:
И я попробовал большинство из них в нескольких комбинациях, где это имело смысл, они будут взаимодействовать - ничто! Я в конце своего остроумия. Кто-либо видел проблему как это, прежде чем это сможет, надо надеяться, пролить некоторый свет на нее?
Спасибо!
Кодировки в вашем XML и XSD (или DTD) различаются.
Заголовок файла XML: Xml version = '1.0' encoding = 'utf-8'?>
Заголовок файла XSD: Xml version = '1.0' encoding = 'utf-16'? >
Другой возможный сценарий, который вызывает это, - когда что-либо предшествует объявлению типа документа XML. т.е. у вас может быть что-то вроде этого в буфере:
helloworld<?xml version="1.0" encoding="utf-8"?>
или даже пробел или специальный символ.
Есть некоторые специальные символы, называемые маркерами порядка байтов, которые могут находиться в буфере. Перед передачей буфера в синтаксический анализатор сделайте следующее ...
String xml = "<?xml ...";
xml = xml.trim().replaceFirst("^([\\W]+)<","<");