org.xml.sax.SAXParseException: содержимое не разрешено в прологе

131

У меня есть клиент веб-службы на основе 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)
  • 11
    Было бы полезно, если бы вы показали нам XML, который вы пытаетесь проанализировать. (Я ожидаю, что только первые несколько строк сделают)
  • 0
    Спасибо, Стивен, я пытаюсь извлечь XML-запрос из платформы AXIS и вставить его сюда. Таким образом, общее понимание вышеуказанной ошибки - это то, что XML не является правильно сформированным
Показать ещё 1 комментарий
Теги:

27 ответов

219
Лучший ответ

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


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

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

  • 2
    Для всех, как я, кто изо всех сил пытается понять, что делать с Джоном Хамфрисом - предложение w00te: измените Document document = documentBuilder.parse(new InputSource(new StringReader(xml))) на Document document = documentBuilder.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("UTF-8"))))
27

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

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

  • 0
    То же самое с попыткой разобрать каталог вместо имени файла, FWIW.
  • 0
    ... @Egor, поэтому все ненавидят XML. Потерять 2 дня работы из-за такой глупой неудачи ..
Показать ещё 2 комментария
25

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

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

  • 1
    +1. Я обнаружил, что некоторые синтаксические анализаторы XML игнорируют это исключение, даже когда пролог XML содержит пробелы - поэтому я думаю, что определенно стоит проверить, что ничто не предшествует биту <?xml ver...
9

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

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

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

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

  • изменение кодировки самого файла
  • изменение заголовка UTF-16 на UTF-8
  • 1
    Я предполагаю, что в целом любой случай, когда парсер получает противоречивую информацию о кодировке символов, может вызвать эту проблему.
9

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

  • 0
    Я проверил и похоже, что XML хорошо сформирован. Снимок экрана: - <? Xml version = "1.0" encoding = "UTF-8"?> <Soapenv: Envelope xmlns: soapenv = " schemas.xmlsoap.org/soap/envelope " xmlns: xsd = " w3.org/ 2001 / XMLSchema "xmlns: xsi =" w3.org/2001/XMLSchema-instance "> <soapenv: Header> <wsse: Security xmlns: wsse =" docs.oasis-open.org/wss/2004/01/… " soapenv: mustUnderstand = "1"> .... </ wsse: Security> </ soapenv: Header> <soapenv: Body> .XX .. </ soapenv: Body> </ soapenv: Envelope>
  • 1
    Да, если впереди есть тире, это нарушит 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 к разочаровывающим сообщениям об ошибках.

3

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

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

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

3

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

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

2

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

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

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

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

2

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

  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 *. Не знаю, как это работает.

2

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

1

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

  • 0
    его работало нормально. пальцы вверх
1

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

Изображение 4517

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

1

Иногда это код, а не 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 и все еще получаете эту ошибку, запишите точное содержимое, передаваемое парсеру; иногда то, что на самом деле было (пыталось быть) проанализировано, удивительно.

1

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

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

1

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

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

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

0

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

0

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

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

MarshallingMessageConverter

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

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

0

Я взял код 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);
	}
	
}

}
0

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

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

0

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

0

В последнее время мы столкнулись с такой же проблемой, и оказалось, что это плохой 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" был весьма удобен при устранении неполадок.

0

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

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

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

0

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

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>";
0

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

  • 0
    Я удостоверился, что не нажимаю ни на какие ключи
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню