Ваш код не работает, потому что он делает это:
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
на каждой итерации.
Это только один из нескольких способов решения этой проблемы.
Это часто вызвано пробелом перед объявлением XML, но это может быть любой текст, например тире или любой символ. Я часто говорю, что это вызвано белым пространством, потому что люди предполагают, что пустое пространство всегда невежественно, но здесь это не так.
Еще одна вещь, которая часто возникает, - это спецификация UTF-8 (знак байтового байта) который является разрешен до того, как объявление XML может рассматриваться как пробел, если документ передается как поток символов в XML-парсер, а не как поток байтов.
Тот же может произойти, если файлы схемы (.xsd) используются для проверки файла xml, а один из файлов схемы имеет спецификацию UTF-8.
Даже я столкнулся с подобной проблемой. Причиной был некоторый символ мусора в начале файла.
Исправить: просто откройте файл в текстовом редакторе (проверен на Sublime text) удалите любой отступ, если он есть в файле, и скопируйте все содержимое файла в новый файл и сохраните его. Это оно!. Когда я запускал новый файл, он работал без каких-либо ошибок синтаксического анализа.
В последнее время у нас была та же проблема, и оказалось, что это плохой 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» был весьма полезен при устранении проблемы.
Я выполнил инструкции, найденные здесь здесь , и я получил ту же ошибку.
Я пробовал несколько вещей для ее решения (например, изменение кодировки, ввод XML-файла, а не копирование -pesting it ect) в Notepad и XML Notepad, но ничего не получилось.
Проблема была решена, когда я редактировал и сохранял свой XML-файл в Notepad ++ (кодирование -> utf-8 без спецификации)
Для всех тех, кто получает эту ошибку: 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»
Надеюсь, что это поможет кому-то! !!
Просто потратил 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 к разочаровывающим сообщениям об ошибках.
Просто дополнительная мысль об этом в будущем. Получение этой ошибки может быть случайным, когда вы просто удаляете ключ удаления или какой-либо другой случай, когда у них есть окно XML в качестве активного дисплея и не обращают внимания. Это случилось со мной раньше с файлом struts.xml в моем веб-приложении. Неуклюжие локти ...
Для тех же проблем я удалил следующую строку:
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 *. Не знаю, как это работает.
Попробуйте использовать 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();
}
Попробуйте добавить пробел между строкой encoding="UTF-8"
в прологе и завершением ?>
. В XML пролог обозначает этот элемент с разделителем-вопросительным знаком в начале документа (в то время как пролог тега в stackoverflow относится к языку программирования).
Добавлено: Является ли это тире перед вашей прологовой частью документа? Это была бы ошибка там, имеющая данные перед прологом, -<?xml version="1.0" encoding="UTF-8"?>
.
Мой ответ не помог бы вам, возможно, но это поможет с этой проблемой в целом.
Когда вы видите такое исключение, вы должны попытаться открыть свой XML-файл в любом Hex-редакторе, а иногда вы можете увидеть дополнительные байты в начале файла, который текстовый редактор не отображает.
Удалите их, и ваш xml будет проанализирован.
У меня была та же проблема (и решена ее), пытаясь разобрать XML-документ с помощью freemarker.
У меня не было пробелов перед заголовком XML-файла.
Проблема возникает тогда и только тогда, когда кодировка файла и атрибут кодирования XML различны. (например: файл UTF-8 с атрибутом UTF-16 в заголовке).
Итак, у меня было два способы решения проблемы:
Следующий код,
Document doc = dBuilder.parse(new InputSource(new StringReader("file.xml")));
также приведет к этой ошибке,
[ Fatal Error]: 1: 1: Содержимое не разрешено в proog.org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Содержимое не разрешено в прологе.
blockquote>, потому что он пытается проанализировать строковый литерал,
"file.xml"
(а не содержимое файлаfile.xml
) и не работает, потому что"file.xml"
в виде строки не является корректным XML.Fix: Remove
StringReader()
:Document doc = dBuilder.parse(new InputSource("file.xml"));
Точно так же грязные проблемы с буфером могут оставить остаточный мусор перед фактическим XML. Если вы тщательно проверили свой XML и все еще получаете эту ошибку, запишите точное содержимое, передаваемое парсеру; иногда то, что на самом деле происходит (пытается быть), является неожиданным.
Задайте свой документ таким образом:
<?xml version="1.0" encoding="UTF-8" ?>
<root>
%children%
</root>
У меня была та же проблема с spring
MarshallingMessageConverter
blockquote>и кодом предварительного кода.
Мейби кому-то понадобится Причина: BytesMessage #readBytes - чтение байтов .. и я забыл, что чтение - это операция в одном направлении. Вы не можете прочитать дважды.
У меня была та же проблема.
Сначала я загрузил XML-файл на локальный рабочий стол, и я получил Content is not allowed in prolog
во время импорта файла на сервер портала. Даже визуальный файл выглядел хорошо для меня, но как-то он был поврежден.
Итак, я перезагрузил тот же файл и попробовал то же самое, и он работал.
Если все остальное не работает, откройте файл в двоичном формате, чтобы убедиться, что в начале файла нет смешных символов [3 непечатаемых символа в начале файла, которые идентифицируют файл как utf-8]. Мы это сделали и нашли. поэтому мы преобразовали файл с utf-8 в ascii, и он сработал.
Я взял код 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);
}
}
}
На самом деле в дополнение к Почте Юрия Зубарева
Когда вы передаете несуществующий 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 дня, чтобы определить реальную проблему.
Как уже указывал Майк Соколов, одной из возможных причин является наличие некоторого символа / s (например, пробела) перед тегом.
Если ваш входной XML читается как String (в отличие от байтового массива), вы можете использовать замену своей строки ввода с помощью приведенного ниже кода, чтобы убедиться, что все «ненужные» символы перед тегом xml стираются.
inputXML=inputXML.substring(inputXML.indexOf("<?xml"));
Вы необходимо убедиться, что входной XML-файл начинается с тега xml.
Я также получал то же
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>";
Это означает, что XML некорректен или тело ответа вообще не является XML-документом.
В моем случае я получил эту ошибку, потому что API, который я использовал, мог возвращать данные либо в формате XML, либо в формате JSON. Когда я тестировал его с помощью браузера, он по умолчанию использовал формат XML, но когда я вызывал один и тот же вызов из приложения Java, API возвращал отформатированный ответ JSON, что, естественно, вызывало ошибку синтаксического анализа.