"Содержимое не допускается в прологе" при разборе совершенно допустимого 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

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

спасибо!

12 66

12 ответов:

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

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

любые символы перед "<?xml…." приведет выше "орг.XML.саксофон.SAXParseException: содержание не допускается в прологе" сообщение об ошибке.

точка "." перед “<?xml….

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

Ref:http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/

я столкнулся с такой же проблемой. В моем случае XML-файлы были сгенерированы из программы c# и переданы в 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

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

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

я столкнулся с той же проблемой, которая называется "контент не разрешен в прологе" в моем xml-файле.

решение

изначально моя корневая папка была'#Filename'.

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

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

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

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

удаление XML-декларации решило это

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

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

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

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

ниже приведены причины выше " орг.XML.саксофон.SAXParseException: содержание не допускается в прологе" исключение.

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

в моем случае, у меня была проблема с . Это было решено с просто собирается Build > Clean Project.

в духе "просто удалите все эти странные символы перед

    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.

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

исправлено путем сохранения файла в notpad++ с кодировкой (Tab) > Encode in UTF-8:selected (был кодирован в UTF-8-BOM)