«Содержимое недопустимо в прологе» при разборе совершенно корректного XML на GAE - PullRequest
85 голосов
/ 13 июня 2010

Последние 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

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

Спасибо!

Ответы [ 13 ]

0 голосов
/ 12 декабря 2016

ниже - причина выше «org.xml.sax.SAXParseException: содержимое не разрешено в прологе».

  1. Сначала проверьте путь к файлу schema.xsd и file.xml.
  2. Кодировка в вашем XML и XSD (или DTD) должна быть одинаковой.Заголовок файла XML: <?xml version='1.0' encoding='utf-8'?>Заголовок файла XSD: <?xml version='1.0' encoding='utf-8'?>
  3. , если что-то предшествует объявлению типа документа XML.ie: hello<?xml version='1.0' encoding='utf-16'?>
0 голосов
/ 21 февраля 2015

В моем случае проблема была в том, чтобы заменить немецкие умлауты (äöü) их HTML-эквивалентами ...

0 голосов
/ 21 августа 2013

У меня был символ табуляции вместо пробелов. Замена вкладки '\ t' устранила проблему.

Вырежьте и вставьте весь документ в редактор, например Блокнот ++, и отобразите все символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...