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


161

У меня есть клиент веб-службы на основе 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, который вы пытаетесь проанализировать. (Я ожидаю, что только первые несколько строк подойдут.)
Стивен С.

Спасибо, Стивен, я пытаюсь извлечь XML-запрос из платформы AXIS и вставить его сюда. Таким образом, общее понимание вышеуказанной ошибки - это то, что XML не является правильно сформированным.
ag112

У меня была эта проблема, потому что я пытался преобразовать имя строки файла XML, а не файл XML в виде строки! : P
Gaʀʀʏ

Ответы:


243

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


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

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


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

32

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

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


То же самое с попыткой разобрать каталог вместо имени файла, FWIW.
rogerdpack

... @Egor, поэтому все ненавидят XML. Потеря 2 дней работы из-за такой глупой неудачи ..
Gewure

Абсолютно согласен @Gewure :) Это был какой-то древний пост 2012 года, и я даже забыл об этом, но это правда
Егор

1
Это также происходит, когда у вас есть правильный путь, но со специальными символами, такими как: C: \ # MyFolder \ My.XML Файл существует, но "#" создает проблему для анализатора XML ... самой Java, а также M $ Windows, не имеет проблем с этим именем папки .... Очень плохое поведение сообщения об исключении ....
Alex

26

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

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


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

11

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

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

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

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

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

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

9

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


Я проверил и похоже, что 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>
ag112

1
Да, если впереди есть тире, это нарушит XML.
Юрий Зубарев

7

Просто потратил 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

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

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


4

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

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

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


4

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

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

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

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

[Фатальная ошибка]: 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
Это решение направлялось по правильному пути, так как я забыл добавить applicaionContext.xmlпуть в коде и не проверял код, искал ошибку только в XML-файле
Мринмой

3

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


2

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


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 и IDE Netbeans с Java * jdk1.6.0_13 *. Понятия не имею, как это работает.


2

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

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

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

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


2

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

дополнительное пространство

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


1

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

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

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


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, что означает «NO Byte Order Mark»

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



1

Чтобы исправить проблему спецификации в системах 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

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


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

0

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

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

0

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

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

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


0

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

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

<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-адресом был символ «/». «TCP / IP Monitor» был очень удобен при устранении неполадок.


0

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


0

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

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


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

Настройте ваш документ так:

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

0

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

MarshallingMessageConverter

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

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


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

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

plutil -convert xml1 info.plist

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


0

У меня была такая же проблема с некоторыми XML-файлами, я решил прочитать файл с кодировкой ANSI (Windows-1252) и написать файл с кодировкой UTF-8 с помощью небольшого скрипта на Python. Я пытался использовать Notepad ++, но у меня не было успеха:

import os
import sys

path = os.path.dirname(__file__)

file_name = 'my_input_file.xml'

if __name__ == "__main__":
    with open(os.path.join(path, './' + file_name), 'r', encoding='cp1252') as f1:
        lines = f1.read()
        f2 = open(os.path.join(path, './' + 'my_output_file.xml'), 'w', encoding='utf-8')
        f2.write(lines)
        f2.close()
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.