«Содержание не разрешено в прологе» при разборе совершенно корректного 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 на наличие «невидимых символов» или символов, не кодированных в UTF8, и т. д. Я просматривал его побайтно в массиве для меток порядка следования байтов или чего-то подобного , Ничего такого; он проходит каждый проверочный тест, который я мог бы выполнить. Еще более странно, что это происходит, если я использую синтаксический анализатор на основе Saxon, но ТОЛЬКО в GAE он всегда отлично работает в моей локальной среде.

Очень сложно отследить код на наличие проблем, когда я могу запустить отладчик только в среде, которая отлично работает (я не нашел хорошего способа удаленной отладки в GAE). Тем не менее, используя примитивные средства, которые у меня есть, я попробовал миллион подходов, в том числе:

  • XML с прологом и без него
  • С символами новой строки и без них
  • С и без атрибута "encoding =" в прологе
  • Оба стиля новой строки
  • С информацией о порции и без нее, присутствующей в потоке HTTP

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

Спасибо!

71 голос | спросил Adrian Petrescu 13 J0000006Europe/Moscow 2010, 06:52:42

11 ответов


0

Кодировка в вашем 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"?>  

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

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

String xml = "<?xml ...";
xml = xml.trim().replaceFirst("^([\\W]+)<","<");
ответил Romain Hippeau 13 J0000006Europe/Moscow 2010, 07:02:04
0

Это сообщение об ошибке всегда вызывается недопустимым содержимым XML в начальном элементе. Например, дополнительная маленькая точка «.» В начале элемента XML.

Любые символы перед «<?xml….» приведут к значению « org.xml.sax.SAXParseException: содержание запрещено в прологе ».

Маленькая точка «. » перед “<?xml….

Чтобы исправить это, просто удалите все эти странные символы перед “<?xml“.

Ссылка: http: //www .mkyong.com /Java /SAX-ошибок контент-это-не-разрешенный-в-пролог /

ответил Sunmit Girme 7 Maypm13 2013, 16:19:53
0

Я столкнулся с той же проблемой. В моем случае XML-файлы были сгенерированы из программы на c # и переданы в AS400 для дальнейшей обработки. После некоторого анализа выяснилось, что я использовал кодировку UTF8 при создании файлов XML, тогда как javac (в AS400) использует «UTF8 без BOM». Итак, пришлось написать дополнительный код, подобный указанному ниже:

//create encoding with no BOM
Encoding outputEnc = new UTF8Encoding(false); 
//open file with encoding
TextWriter file = new StreamWriter(filePath, false, outputEnc);           

file.Write(doc.InnerXml);
file.Flush();
file.Close(); // save and close it
ответил Saturn CAU 23 Maypm14 2014, 17:59:11
0

Удаление объявления xml решило проблему

<?xml version='1.0' encoding='utf-8'?>
ответил F.O.O 18 J000000Wednesday18 2018, 18:21:36
0

В моем xml-файле заголовок выглядел так:

<?xml version="1.0" encoding="utf-16"? />

В тестовом файле я читал байты файла и декодировал данные как UTF-8 (не понимая, что заголовок в этом файле был utf-16) для создания строки.

byte[] data = Files.readAllBytes(Paths.get(path));
String dataString = new String(data, "UTF-8");

Когда я попытался десериализовать эту строку в объект, я увидел ту же ошибку:

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.

Когда я обновил вторую строку до

String dataString = new String(data, "UTF-16");

Мне удалось десериализовать объект просто отлично. Итак, как заметил Ромен выше, кодировки должны совпадать.

ответил dfritch 9 FebruaryEurope/MoscowbMon, 09 Feb 2015 21:03:01 +0300000000pmMon, 09 Feb 2015 21:03:01 +030015 2015, 21:03:01
0

Я столкнулся с той же проблемой под названием «Содержимое запрещено в прологе» в моем XML-файле.

Решение

Изначально моей корневой папкой было «# Имя файла ».

Когда я удалил первый символ '#', ошибка была устранена.

Нет необходимости удалять #filename ... Попробуйте таким образом.

Вместо передачи объекта File или URL-адресу методу unmarshaller используйте FileInputStream.

File myFile = new File("........");
Object obj = unmarshaller.unmarshal(new FileInputStream(myFile));
ответил Ravi Kiran 23 Jpm1000000pmFri, 23 Jan 2015 14:02:36 +030015 2015, 14:02:36
0

У меня была проблема при проверке xml-файла в notepad ++ и сохранении файла, хотя у меня был верхний xml-тег utf-8 как <?xml version="1.0" encoding="utf-8"?>

Исправлено путем сохранения файла в notpad ++ с помощью Encoding (Tab)> Кодировать в UTF-8: выбрано (было Кодировать в UTF-8-BOM)

ответил techloris_109 27 J000000Friday18 2018, 09:24:05
0

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

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

ответил SoloPilot 21 PM00000050000001431 2013, 17:16:14
0

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

ответил MBaas 21 FebruaryEurope/MoscowbSat, 21 Feb 2015 17:31:43 +0300000000pmSat, 21 Feb 2015 17:31:43 +030015 2015, 17:31:43
0

ниже приведены причины выше исключения «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.i.e: hello<?xml version='1.0' encoding='utf-16'?>
ответил Avinash Dubey 12 MonEurope/Moscow2016-12-12T12:36:17+03:00Europe/Moscow12bEurope/MoscowMon, 12 Dec 2016 12:36:17 +0300 2016, 12:36:17
0

В духе «просто удалите все эти странные символы перед <? xml", вот мой Java-код, который хорошо работает с вводом через BufferedReader:

    BufferedReader test = new BufferedReader(new InputStreamReader(fisTest));
    test.mark(4);
    while (true) {
        int earlyChar = test.read();
        System.out.println(earlyChar);
        if (earlyChar == 60) {
            test.reset();
            break;
        } else {
            test.mark(4);
        }
    }

FWIW, байты, которые я видел (в десятичном виде): 239, 187, 191.

ответил Tamias 13 J0000006Europe/Moscow 2018, 18:07:48

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132