Подтвердить что ты не робот

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

Кодирование в вашем 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]+)<","<");

Ответ 2

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

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

Маленькая точка " . " Перед "<?xml….

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

Ссылка: http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/

Ответ 3

Я столкнулся с той же проблемой. В моем случае файлы XML были сгенерированы из программы С# и загружены в AS400 для дальнейшей обработки. После некоторого анализа выяснилось, что я использую кодировку UTF8 при создании файлов XML, тогда как javac (в AS400) использует "UTF8 без спецификации". Поэтому пришлось написать дополнительный код, аналогичный приведенному ниже:

//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

Ответ 4

Удаление объявления xml разрешило его

<?xml version='1.0' encoding='utf-8'?>

Ответ 5

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

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

Ответ 6

Я столкнулся с той же проблемой, что и "Содержимое не разрешено в прологе" в моем XML файле.

Решение

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

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

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

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

File myFile = new File("........");
Object obj = unmarshaller.unmarshal(new FileInputStream(myFile));

Ответ 7

В моем 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");

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

Ниже приведено вышеописанное исключение org.xml.sax.SAXParseException: Content недопустимо в прологе.

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

Ответ 11

В моем случае у меня возникла проблема с файлом build.xml. Это было решено, просто выбрав Build > Clean Project.

Ответ 12

В духе "просто удалите все эти странные символы перед <? 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.

Ответ 13

Неожиданная причина: символ # в пути к файлу

Из-за некоторой внутренней ошибки ошибка Содержимое недопустимо в прологе, также появляется, если само содержимое файла на 100% правильно, но вы указываете имя файла, например C:\Data\#22\file.xml.

Это может также относиться и к другим специальным символам.

Как проверить: Если вы переместили свой файл в путь без специальных символов и ошибка исчезла, то это была проблема.

Ответ 14

Я поймал то же самое сообщение об ошибке сегодня. Решение состояло в том, чтобы изменить документ с UTF-8 с спецификации на UTF-8 без спецификации