Не удалось создать сообщение SOAP из-за исключения: ошибка чтения XML [duplicate]

Ваш код не работает, потому что он делает это:

Create variable `funcs` and assign it an empty array;  
Loop from 0 up until it is less than 3 and assign it to variable `i`;
    Push to variable `funcs` next function:  
        // Only push (save), but don't execute
        **Write to console current value of variable `i`;**

// First loop has ended, i = 3;

Loop from 0 up until it is less than 3 and assign it to variable `j`;
    Call `j`-th function from variable `funcs`:  
        **Write to console current value of variable `i`;**  
        // Ask yourself NOW! What is the value of i?

Теперь вопрос в том, каково значение переменной i при вызове функции? Поскольку первый цикл создается с условием i < 3, он немедленно останавливается, когда условие ложно, поэтому оно i = 3.

Вам нужно понять, что во время создания ваших функций ни один из их кодов не выполняется, он сохраняется только позже. И поэтому, когда они вызываются позже, интерпретатор выполняет их и спрашивает: «Каково текущее значение i

Итак, ваша цель - сначала сохранить значение функции i для функции и только после этого сохраните функцию до funcs. Это можно сделать следующим образом:

var funcs = [];
for (var i = 0; i < 3; i++) {          // let's create 3 functions
    funcs[i] = function(x) {            // and store them in funcs
        console.log("My value: " + x); // each should log its value.
    }.bind(null, i);
}
for (var j = 0; j < 3; j++) {
    funcs[j]();                        // and now let's run each one to see
}

Таким образом, каждая функция будет иметь свою собственную переменную x, и мы устанавливаем значение x на значение i на каждой итерации.

Это только один из нескольких способов решения этой проблемы.

129
задан abhi 12 May 2016 в 13:37
поделиться

24 ответа

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


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

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

201
ответ дан ParkerHalo 25 August 2018 в 07:17
поделиться

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

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

0
ответ дан Aditya Gaykar 25 August 2018 в 07:17
поделиться

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

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

<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
ответ дан Amir Keibi 25 August 2018 в 07:17
поделиться

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

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

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

1
ответ дан BitCollector 25 August 2018 в 07:17
поделиться

Для всех тех, кто получает эту ошибку: WARNING: 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 Bate Order Mark»

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

1
ответ дан CA Martin 25 August 2018 в 07:17
поделиться

Просто потратил 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 к разочаровывающим сообщениям об ошибках.

6
ответ дан colin_froggatt 25 August 2018 в 07:17
поделиться

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

0
ответ дан demongolem 25 August 2018 в 07:17
поделиться

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

  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 дает проблемы.

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

2
ответ дан Dineshkumar Ponnusamy 25 August 2018 в 07:17
поделиться

Попробуйте использовать 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
ответ дан Giuseppe Milazzo 25 August 2018 в 07:17
поделиться

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

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

26
ответ дан hardmath 25 August 2018 в 07:17
поделиться

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

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

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

3
ответ дан Igor Kustov 25 August 2018 в 07:17
поделиться
3
ответ дан Jerome Louvel 25 August 2018 в 07:17
поделиться

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

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

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

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

  1. изменение кодирования самого файла
  2. изменение заголовка UTF-16 на UTF-8
9
ответ дан JoshDM 25 August 2018 в 07:17
поделиться

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

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

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

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

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

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

Fix: Remove StringReader():

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

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

0
ответ дан kjhughes 25 August 2018 в 07:17
поделиться

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

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    %children%
</root>
0
ответ дан Laurel 25 August 2018 в 07:17
поделиться

У меня была та же проблема с spring

MarshallingMessageConverter

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

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

0
ответ дан Learning Always 25 August 2018 в 07:17
поделиться

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

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

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

0
ответ дан Marko 25 August 2018 в 07:17
поделиться

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

2
ответ дан Ralph 25 August 2018 в 07:17
поделиться

Я взял код 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
ответ дан RodH 25 August 2018 в 07:17
поделиться

На самом деле в дополнение к Почте Юрия Зубарева

Когда вы передаете несуществующий 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
ответ дан rogerdpack 25 August 2018 в 07:17
поделиться

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

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

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

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

2
ответ дан Sahil J 25 August 2018 в 07:17
поделиться

Я также получал то же

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 я заменил & amp; lt и & gt; gt на & lt; и> затем ошибка погасла, и я получил правильный ответ. Не уверен, как это сработало, но оно сработало.

sample:

String body = "<ns:addNumbersResponse xmlns:ns=\"http://java.duke.org\"><ns:return>"
            +sum
            +"</ns:return></ns:addNumbersResponse>";
1
ответ дан shareef 25 August 2018 в 07:17
поделиться

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

9
ответ дан Yuriy Zubarev 25 August 2018 в 07:17
поделиться

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

0
ответ дан zovits 25 August 2018 в 07:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: