org.xml.sax.SAXParseException: содержимое не разрешено в прологе - PullRequest
145 голосов
/ 28 февраля 2011

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

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

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)

Ответы [ 29 ]

216 голосов
/ 08 октября 2011

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


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

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

27 голосов
/ 12 ноября 2011

Собственно в дополнение к посту Юрия Зубарева

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

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 дня, чтобы определить настоящую проблему.

26 голосов
/ 28 февраля 2011

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

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

11 голосов
/ 22 июля 2013

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

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

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

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

  1. изменение кодировки самого файла
  2. изменение заголовка UTF-16 на UTF-8
9 голосов
/ 28 февраля 2011

Это означает, что XML искажен или тело ответа вообще не является документом XML.

7 голосов
/ 08 ноября 2012

Только что потратил 4 часа на поиск аналогичной проблемы в WSDL.Оказывается, WSDL использовал XSD, который импортирует другое пространство имен XSD.Этот импортированный XSD содержал следующее:

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.xyz.com/Services/CommonTypes" elementFormDefault="qualified"
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:CommonTypes="http://www.xyz.com/Services/CommonTypes">

 <include schemaLocation=""></include>  
    <complexType name="RequestType">
        <....

Обратите внимание на пустой элемент include!Это был корень моих бед.Я думаю, что это вариация файла Егора не найдена проблема выше.

+ 1 к неутешительным сообщениям об ошибках.

4 голосов
/ 08 октября 2011

В моем случае удаление атрибута 'encoding = "UTF-8" в целом сработало.

Это похоже на проблему кодировки набора символов, возможно, потому что ваш файл на самом деле не в UTF-8.

3 голосов
/ 25 марта 2013

Мой ответ, вероятно, не поможет вам, но в целом поможет.

Когда вы видите такого рода исключения, вы должны попытаться открыть свой XML-файл в любом Hex-редакторе, и иногда вы можете увидеть дополнительные байты в начале файла, которые текстовый редактор не показывает.

Удалите их, и ваш xml будет проанализирован.

2 голосов
/ 27 января 2014

Для тех же проблем я удалил следующую строку,

  File file = new File("c:\\file.xml");
  InputStream inputStream= new FileInputStream(file);
  Reader reader = new InputStreamReader(inputStream,"UTF-8");
  InputSource is = new InputSource(reader);
  is.setEncoding("UTF-8");

Работает нормально.Не очень уверен, почему этот UTF-8 дает проблемы.Чтобы держать меня в шоке, он прекрасно работает и для UTF-8.

Я использую Windows-7 32 бит и IDE Netbeans с Java * jdk1.6.0_13 *.Понятия не имею, как это работает.

2 голосов
/ 11 января 2014

Если ничего не помогает, откройте файл в двоичном формате, чтобы убедиться, что в начале файла нет забавных символов [3 непечатаемых символа, которые идентифицируют файл как utf-8] в начале файла. Мы сделали это и нашли. поэтому мы конвертировали файл из utf-8 в ascii, и это сработало.

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