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 ]

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

Как уже указал Майк Соколов, одной из возможных причин является наличие некоторых символов (например, пробела) перед тегом.

Если ваш входной XML читается как строка(в отличие от байтового массива), тогда вы можете использовать замену входной строки приведенным ниже кодом, чтобы убедиться, что все «ненужные» символы перед удалением тега xml.

inputXML=inputXML.substring(inputXML.indexOf("<?xml"));

Вам необходимоубедитесь, что входной xml начинается с тега xml.

2 голосов
/ 26 августа 2018

Сначала очистите проект, затем пересоберите проект.Я также столкнулся с той же проблемой.После этого все стало хорошо.

1 голос
/ 05 февраля 2018

В моем случае web.xml в моем приложении имеет дополнительное пространство, даже после того, как удаленное не работает, мне пришлось отменить изменения и их исправления, и да, я играл с logging.properties и web.xml в моем коте, но даже после того, как я вернул ошибку, ошибка продолжала отображаться, поэтому это исправило ее)).

extra space

Если быть точным, я попытался добавить org.apache.catalina.filters.ExpiresFilter.level = FINE над потоком что-то о logging.properties

1 голос
/ 17 ноября 2017

Иногда это код, а не XML

Следующий код,

Document doc = dBuilder.parse(new InputSource(new StringReader("file.xml")));

также приведет к этой ошибке,

[Fatal Error]: 1: 1: содержимое не разрешено в prolog.org.xml.sax.SAXParseException;номер строки: 1;columnNumber: 1;Содержимое недопустимо в прологе.

, потому что он пытается проанализировать строковый литерал, "file.xml" (не содержимое файла file.xml) и потерпел неудачу, поскольку "file.xml" как строка не являетсяправильно сформированный XML.

Исправление: удаление StringReader():

Document doc = dBuilder.parse(new InputSource("file.xml"));

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

1 голос
/ 19 мая 2016

Для всех тех, кто получает эту ошибку: ПРЕДУПРЕЖДЕНИЕ: Catalina.start с использованием conf / server.xml: содержимое не разрешено в прологе.

Не очень информативно ... но на самом деле это означает, что естьмусор в вашем файле conf / server.xml.

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

Чтобы проверить, есть ли у вас мусор в файле, нужно открыть его с помощью «HEX-редактора». Если перед этой строкой вы видите какой-либо символ

     "<?xml version="1.0" encoding="UTF-8"?>"

, то это будет мусором

     "‰ŠŒ<?xml version="1.0" encoding="UTF-8"?>"

это ваша проблема .... Решение состоит в том, чтобы использовать хороший HEX-редактор .. Один, который позволит вам сохранять файлы с различными типами кодировки ..

Затем просто сохраните егокак UTF-8.Некоторым системам, которые используют файлы XML, может потребоваться его сохранение в формате UTF NO BOM, что означает «NO Byte Order Mark»

Надеюсь, это кому-то поможет !!

1 голос
/ 30 июля 2014

Я следовал инструкциям, найденным здесь , и я получил ту же ошибку.

Я пытался решить ее несколькими способами (например, изменив кодировку, введя XML-файл, а не вставляя копиюэто так) в Notepad и XML Notepad, но ничего не получалось.

Проблема была решена, когда я отредактировал и сохранил свой XML-файл в Notepad ++ (кодировка -> utf-8 без спецификации)

1 голос
/ 14 мая 2019

Чтобы исправить проблему спецификации в системах Unix / Linux:

  1. Проверьте, есть ли нежелательный символ спецификации: hexdump -C myfile.xml | more Нежелательный символ спецификации появится в начале файла как ...<?xml>

  2. Либо сделайте file myfile.xml. Файл с символом спецификации будет выглядеть так: myfile.xml: XML 1.0 document text, UTF-8 Unicode (with BOM) text

  3. Исправить один файл с помощью: tail -c +4 myfile.xml > temp.xml && mv temp.xml myfile.xml

  4. Повторите 1 или 2, чтобы проверить, что файл был обработан. Вероятно, также разумно сделать view myfile.xml, чтобы проверить, что содержание осталось.

Вот скрипт bash для очистки всей папки XML-файлов:

#!/usr/bin/env bash

# This script is to sanitise XML files to remove any BOM characters

has_bom() { head -c3 "$1" | LC_ALL=C grep -qe '\xef\xbb\xbf'; }

for filename in *.xml ; do
  if has_bom ${filename}; then
    tail -c +4 ${filename} > temp.xml
    mv temp.xml ${filename}
  fi
done

0 голосов
/ 25 мая 2018

Попробуйте использовать BOMInputStream в apache.commons.io:

public static <T> T getContent(Class<T> instance, SchemaType schemaType, InputStream stream) throws JAXBException, SAXException, IOException {

    JAXBContext context = JAXBContext.newInstance(instance);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    Reader reader = new InputStreamReader(new BOMInputStream(stream), "UTF-8");

    JAXBElement<T> entry = unmarshaller.unmarshal(new StreamSource(reader), instance);

    return entry.getValue();
}
0 голосов
/ 27 декабря 2017

У меня была та же проблема с пружиной

MarshallingMessageConverter

и с кодом предварительной обработки.

Возможно, кому-то понадобится причина: BytesMessage #readBytes - чтение байтов .. и я забыл, что чтение - это операция в одном направлении.Вы не можете читать дважды.

0 голосов
/ 28 мая 2012

я тоже получал такой же

XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,2] Message: Reference is not allowed in prolog.

, когда мое приложение создавало ответ XML для вызова веб-службы RestFull. При создании формата XML String я заменил & lt и & gt на <и>, затем ошибка исчезла, и я получил правильный ответ. Не уверен, как это работает, но это работает.

образец

String body = "<ns:addNumbersResponse xmlns:ns=\"http://java.duke.org\"><ns:return>"
            +sum
            +"</ns:return></ns:addNumbersResponse>";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...