Org.xml.sax.SAXParseException: содержимое не допускается в прологе

У меня есть клиент веб-службы на основе 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)

Ответ 1

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


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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

  • изменение кодировки самого файла
  • изменение заголовка UTF-16 на UTF-8

Ответ 5

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

Ответ 6

Просто потратил 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! Это был корень моих беды. Я думаю, что это вариант для файла Egor, который не найден выше.

+1 к разочаровывающим сообщениям об ошибках.

Ответ 7

В моем случае удаление атрибута 'encoding =' UTF-8 '' полностью сработало.

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

Ответ 8

Мой ответ не помог бы вам, возможно, но это поможет с этой проблемой в целом.

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

  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.

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

Ответ 12

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

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

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

Вы должны быть уверены, что ввод xml начинается с тега xml.

Ответ 13

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

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

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

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

[Неустранимая ошибка]: 1:1: Содержимое не разрешено в proog.org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Содержимое не допускается в прологе.

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

Исправить: Удалить StringReader():

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

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

Ответ 14

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

extra space

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

Ответ 15

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

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

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

Ответ 16

Для всех тех, кто получает эту ошибку: ПРЕДУПРЕЖДЕНИЕ: 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 Что означает "Без байтового байта"

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

Ответ 17

Для меня, Build-> Чистый все исправил!

Ответ 18

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

  1. Проверьте, есть ли нежелательный символ спецификации: hexdump -C myfile.xml | more 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 сделать view myfile.xml чтобы проверить, 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

Ответ 19

Задайте свой документ таким образом:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    %children%
</root>

Ответ 20

Просто дополнительная мысль об этом в будущем. Получение этой ошибки может быть случайным, когда вы просто удаляете ключ удаления или какой-либо другой случай, когда у них есть окно XML в качестве активного дисплея и не обращают внимания. Это случилось со мной раньше с файлом struts.xml в моем веб-приложении. Неуклюжие локти...

Ответ 21

Я тоже получал то же самое

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

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

Пример:

String body = "<ns:addNumbersResponse xmlns:ns=\"http://java.duke.org\"><ns:return>"
            +sum
            +"</ns:return></ns:addNumbersResponse>";

Ответ 22

У меня была такая же проблема.

Сначала я загрузил XML файл на локальный рабочий стол, и я получил Content is not allowed in prolog во время импорта файла на сервер портала. Даже визуальный файл выглядел хорошо для меня, но как-то он был поврежден.

Итак, я повторно загружаю тот же файл и пробовал то же самое, и он работал.

Ответ 23

В последнее время мы столкнулись с такой же проблемой, и оказалось, что это плохой URL-адрес и, следовательно, стандартный HTTP-ответ 403 (который, очевидно, не является корректным XML, который ищет клиент). Я собираюсь поделиться деталями, если кто-то из того же контекста столкнется с этой проблемой:

Это было веб-приложение на основе Spring, в котором "JaxWsPortProxyFactoryBean" bean был настроен для предоставления прокси-сервера для удаленного порта.

<bean id="ourPortJaxProxyService"
    class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"
    p:serviceInterface="com.amir.OurServiceSoapPortWs"
    p:wsdlDocumentUrl="${END_POINT_BASE_URL}/OurService?wsdl"
    p:namespaceUri="http://amir.com/jaxws" p:serviceName="OurService"
    p:portName="OurSoapPort" />

"END_POINT_BASE_URL" - это переменная среды, настроенная в "setenv.sh" экземпляра Tomcat, на котором размещено веб-приложение. Содержимое файла выглядит примерно так:

export END_POINT_BASE_URL="http://localhost:9001/BusinessAppServices"
#export END_POINT_BASE_URL="http://localhost:8765/BusinessAppServices"

Отсутствует ";" после того, как каждая строка вызвала неверный URL и, следовательно, плохой ответ. То есть вместо "BusinessAppServices/OurService? Wsdl" URL имел CR перед "/". "Монитор TCP/IP" был весьма удобен при устранении неполадок.

Ответ 24

В моем случае я получил эту ошибку, потому что API, который я использовал, мог возвращать данные либо в формате XML, либо в формате JSON. Когда я тестировал его с помощью браузера, он по умолчанию использовал формат XML, но когда я вызывал один и тот же вызов из приложения Java, API возвращал отформатированный ответ JSON, который, естественно, вызывал ошибку синтаксического анализа.

Ответ 25

Даже я столкнулся с подобной проблемой. Причиной был некоторый символ мусора в начале файла.

Исправить: просто откройте файл в текстовом редакторе (проверен на Sublime text), удалите любой отступ, если он есть в файле, и скопируйте все содержимое файла в новый файл и сохраните его. Это оно!. Когда я запускал новый файл, он работал без каких-либо ошибок синтаксического анализа.

Ответ 26

Я взял код Dineshkumar и был изменен для правильной проверки файла XML:

import org.apache.log4j.Logger;

public class Myclass{

private static final Logger LOGGER = Logger.getLogger(Myclass.class);

/**
 * Validate XML file against Schemas XSD in pathEsquema directory
 * @param pathEsquema directory that contains XSD Schemas to validate
 * @param pathFileXML XML file to validate
 * @throws BusinessException if it throws any Exception
 */
public static void validarXML(String pathEsquema, String pathFileXML) 
	throws BusinessException{	
	String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
	String nameFileXSD = "file.xsd";
	String MY_SCHEMA1 = pathEsquema+nameFileXSD);
	ParserErrorHandler parserErrorHandler;
	try{
		SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA);
		
		Source [] source = { 
			new StreamSource(new File(MY_SCHEMA1))
			};
		Schema schemaGrammar = schemaFactory.newSchema(source);

		Validator schemaValidator = schemaGrammar.newValidator();
		schemaValidator.setErrorHandler(
			parserErrorHandler= new ParserErrorHandler());
		
		/** validate xml instance against the grammar. */
		File file = new File(pathFileXML);
		InputStream isS= new FileInputStream(file);
		Reader reader = new InputStreamReader(isS,"UTF-8");
		schemaValidator.validate(new StreamSource(reader));
		
		if(parserErrorHandler.getErrorHandler().isEmpty()&& 
			parserErrorHandler.getFatalErrorHandler().isEmpty()){
			if(!parserErrorHandler.getWarningHandler().isEmpty()){
				LOGGER.info(
				String.format("WARNING validate XML:[%s] Descripcion:[%s]",
					pathFileXML,parserErrorHandler.getWarningHandler()));
			}else{
				LOGGER.info(
				String.format("OK validate  XML:[%s]",
					pathFileXML));
			}
		}else{
			throw new BusinessException(
				String.format("Error validate  XML:[%s], FatalError:[%s], Error:[%s]",
				pathFileXML,
				parserErrorHandler.getFatalErrorHandler(),
				parserErrorHandler.getErrorHandler()));
		}		
	}
	catch(SAXParseException e){
		throw new BusinessException(String.format("Error validate XML:[%s], SAXParseException:[%s]",
			pathFileXML,e.getMessage()),e);
	}
	catch (SAXException e){
		throw new BusinessException(String.format("Error validate XML:[%s], SAXException:[%s]",
			pathFileXML,e.getMessage()),e);
	}
	catch (IOException e) {
		throw new BusinessException(String.format("Error validate XML:[%s], 
			IOException:[%s]",pathFileXML,e.getMessage()),e);
	}
	
}

}

Ответ 27

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

MarshallingMessageConverter

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

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

Ответ 28

Попробуйте использовать 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();
}

Ответ 29

У меня была такая же проблема при разборе файла info.plist на моем Mac. Однако проблема была исправлена с помощью следующей команды, которая превратила файл в XML.

plutil -convert xml1 info.plist

Надеюсь, что это помогает кому-то.

Ответ 30

Build-> Очисти, исправь мою проблему.