“Содержание не позволяется в прологе” при парсинге совершенно допустимого XML на GAE

Я бил головой об эту абсолютно приводящую в бешенство ошибку в течение прошлых 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 с и без пролога
  • С и без новых строк
  • С и без "кодирования =" приписывают в прологе
  • Оба стиля новой строки
  • С и без большой информации, существующей в потоке HTTP

И я попробовал большинство из них в нескольких комбинациях, где это имело смысл, они будут взаимодействовать - ничто! Я в конце своего остроумия. Кто-либо видел проблему как это, прежде чем это сможет, надо надеяться, пролить некоторый свет на нее?

Спасибо!

93
задан Adrian Petrescu 13 June 2010 в 02:52
поделиться

1 ответ

Кодировки в вашем XML и XSD (или DTD) различаются.
Заголовок файла XML:
Заголовок файла XSD:

Другой возможный сценарий, который вызывает это, - когда что-либо предшествует объявлению типа документа XML. т.е. у вас может быть что-то вроде этого в буфере:

helloworld<?xml version="1.0" encoding="utf-8"?>  

или даже пробел или специальный символ.

Есть некоторые специальные символы, называемые маркерами порядка байтов, которые могут находиться в буфере. Перед передачей буфера в синтаксический анализатор сделайте следующее ...

String xml = "<?xml ...";
xml = xml.trim().replaceFirst("^([\\W]+)<","<");
113
ответ дан 24 November 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: