Вопрос-ответ

org.xml.sax.SAXParseException: Content is not allowed in prolog

org.xml.sax.SAXParseException: Содержимое не разрешено в prolog

У меня есть клиент веб-службы на базе Java, подключенный к веб-службе Java (реализованный на платформе Axis1 framework).

Я получаю следующее исключение в моем файле журнала:

Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
at org.apache.ws.axis.security.WSDoAllReceiver.invoke(WSDoAllReceiver.java:114)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:198)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
Переведено автоматически
Ответ 1

Часто это вызвано пробелом перед объявлением XML, но это может быть любой текст, например, тире или любой символ. Я говорю, что это часто вызвано пробелами, потому что люди предполагают, что пробелы всегда игнорируются, но здесь это не так.


Еще одна вещь, которая часто случается, - это спецификация UTF-8 (метка порядка байтов), которая допускается до того, как XML-объявление может обрабатываться как пробел, если документ передается в виде потока символов анализатору XML, а не в виде потока байтов.

То же самое может произойти, если файлы схемы (.xsd) используются для проверки XML-файла, и один из файлов схемы имеет спецификацию UTF-8.

Ответ 2

Фактически в дополнение к сообщению Юрия Зубарева

Когда вы передаете несуществующий XML-файл в parser. Например, вы передаете

new File("C:/temp/abc")

когда в вашей файловой системе существует только C:/temp/abc.xml файл

В любом случае

builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
document = builder.parse(new File("C:/temp/abc"));

или

DOMParser parser = new DOMParser();
parser.parse("file:C:/temp/abc");

Все выдают одно и то же сообщение об ошибке.

Очень разочаровывающая ошибка, потому что следующая трассировка

javax.servlet.ServletException
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
...
Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
... 40 more

ничего не говорит о факте "неправильное имя файла" или "такой файл не существует". В моем случае у меня был абсолютно правильный XML-файл, и мне пришлось потратить 2 дня, чтобы определить реальную проблему.

Ответ 3

Попробуйте добавить пробел между encoding="UTF-8" строкой в prolog и завершающей ?>. В XML prolog обозначает этот элемент, разделенный вопросительным знаком в скобках, в начале документа (в то время как тег prolog в stackoverflow ссылается на язык программирования).

Добавлено: это тире перед вашей частью prolog документа? Это было бы ошибкой, если бы данные находились перед prolog, -<?xml version="1.0" encoding="UTF-8"?>.

Ответ 4

У меня была такая же проблема (и я решил ее) при попытке проанализировать XML-документ с помощью freemarker.

У меня не было пробелов перед заголовком XML-файла.

Проблема возникает тогда и только тогда, когда кодировка файла и атрибут XML encoding различны. (например: файл UTF-8 с атрибутом UTF-16 в заголовке).

Итак, у меня было два способа решения проблемы:


  1. изменение кодировки самого файла

  2. изменение заголовка UTF-16 на UTF-8

java xml