我有一个基于Java的Web服务客户端连接到Java Web服务(在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)
答案 0 :(得分:215)
这通常是由XML声明之前的空格引起的,但它可能是任何文本,如破折号或任何字符。我说经常是由白色空间引起的,因为人们认为白色空间总是可以忽略不计,但这不是这里的情况。
经常发生的另一件事是 UTF-8 BOM (字节顺序标记),如果文档是,则在将XML声明视为空格之前允许 。作为字符串流传递给XML解析器而不是字节流。
如果使用模式文件(.xsd)验证xml文件并且其中一个模式文件具有 UTF-8 BOM ,则会发生同样的情况。
答案 1 :(得分:27)
实际上除了Yuriy Zubarev的帖子
将不存在的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天来确定真正的问题。
答案 2 :(得分:26)
尝试在序言中的encoding="UTF-8"
字符串和终止?>
之间添加空格。在XML中,prolog在文档的开头指定这个括号 - 问号分隔元素(而stackoverflow中的标记prolog指的是编程语言)。
已添加:该文档位于您的序言部分前面吗?那就是那里的错误,在prolog前面有数据-<?xml version="1.0" encoding="UTF-8"?>
。
答案 3 :(得分:11)
尝试使用freemarker解析XML文档时遇到了同样的问题(并解决了它)。
我在XML文件的标题之前没有空格。
当且仅当文件编码和XML编码属性不同时才会出现问题。(例如:标题中包含UTF-16属性的UTF-8文件)。
所以我有两种解决问题的方法:
答案 4 :(得分:9)
这意味着XML格式不正确或者响应正文根本不是XML文档。
答案 5 :(得分: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
元素!这是我的困境的根源。我猜这是上面没有找到Egor文件的变种。
+1令人失望的错误报告。
答案 6 :(得分:4)
在我的情况下,删除'encoding =“UTF-8”'属性完全奏效。
它看起来像是字符集编码问题,可能是因为你的文件实际上不是UTF-8。
答案 7 :(得分:3)
我的答案可能对你没有帮助,但它通常会对这个问题有帮助。
当您看到这种异常时,您应该尝试在任何十六进制编辑器中打开您的xml文件,有时您可以在文件编辑器未显示的文件开头看到其他字节。
删除它们,您的xml将被解析。
答案 8 :(得分:2)
正如迈克·索科洛夫已经指出的那样,其中一个可能的原因是在标签之前存在一些字符(如空格)。
如果您的输入XML被读取为String(而不是字节数组),那么您 可以使用以下代码替换您的输入字符串,以确保所有&#39;不必要&#39; 擦除xml标记之前的字符。
inputXML=inputXML.substring(inputXML.indexOf("<?xml"));
您需要确保输入xml以xml标记开头。
答案 9 :(得分:2)
首先清理项目,然后重建项目。我也面临着同样的问题。此后一切都变好了。
答案 10 :(得分: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。
使用 Windows-7 32位和Netbeans IDE与Java * jdk1.6.0_13 *。不知道它是如何运作的。
答案 11 :(得分:2)
如果所有其他方法都失败了,请打开二进制文件,以确保文件开头没有有趣的字符[文件开头有3个不可打印的字符,标识文件为utf-8]。我们这样做了,发现了一些。所以我们将文件从utf-8转换为ascii并且工作正常。
答案 12 :(得分:1)
要修复Unix / Linux系统上的BOM表问题:
检查是否存在不需要的BOM字符:
hexdump -C myfile.xml | more
不需要的BOM表字符将以...<?xml>
或者,执行file myfile.xml
。具有BOM表字符的文件将显示为:myfile.xml: XML 1.0 document text, UTF-8 Unicode (with BOM) text
使用以下内容修复单个文件:tail -c +4 myfile.xml > temp.xml && mv temp.xml myfile.xml
重复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
答案 13 :(得分:1)
我按照发现here的说明操作,我也遇到了同样的错误。
我在记事本和XML记事本中尝试了几种方法来解决它(即更改编码,键入XML文件而不是复制粘贴等)但没有任何效果。
当我在Notepad ++中编辑并保存我的XML文件(编码 - &gt;没有BOM的utf-8)时问题得到解决
答案 14 :(得分:1)
对于所有收到此错误的人: 警告:使用conf / server.xml的Catalina.start:prolog中不允许使用内容。
信息量不大..但实际上这意味着你的conf / server.xml文件中有垃圾。
我在其他XML文件中看到了这个确切的错误。这个错误可能是由于使用引入垃圾的文本编辑器进行更改而引起的。
验证文件中是否有垃圾的方法是使用&#34; HEX编辑器&#34;如果在此字符串之前看到任何字符
"<?xml version="1.0" encoding="UTF-8"?>"
像这样将是垃圾
"‰ŠŒ<?xml version="1.0" encoding="UTF-8"?>"
这是你的问题.... 解决方案是使用一个好的HEX编辑器。一个允许您保存具有不同类型编码的文件..
然后将其保存为UTF-8。 某些使用XML文件的系统可能需要将其保存为UTF NO BOM 这意味着使用&#34; NO Byte Order Mark&#34;
希望这可以帮助那些人!!
答案 15 :(得分:1)
以下代码,
Document doc = dBuilder.parse(new InputSource(new StringReader("file.xml")));
也会导致此错误,
[致命错误]:1:1:prolog.org.xml.sax.SAXParseException中不允许内容; lineNumber:1; columnNumber:1; prolog中不允许使用内容。
因为它尝试解析字符串文字"file.xml"
(而不是file.xml
文件的内容)而失败,因为"file.xml"
字符串格式不正确XML。
修复:移除StringReader()
:
Document doc = dBuilder.parse(new InputSource("file.xml"));
同样,脏缓冲区问题可能会在实际XML之前留下残留垃圾。如果您仔细检查了XML并仍然收到此错误,请记录传递给解析器的确切内容;有时,实际上(试图)解析的是令人惊讶的。
答案 16 :(得分:1)
在我的情况下,我的应用程序中的 web.xml 有额外的空间,即使我删除后没有工作,我不得不恢复chages及其修复 是的,我在我的tomcat中玩 logging.properties 和 web.xml ,但即使在我还原之后,错误仍然显示,所以修复了它))。
具体我尝试添加 org.apache.catalina.filters.ExpiresFilter.level = FINE stack over flow something about logging.properties
答案 17 :(得分:0)
我在jenkins junit报告插件中遇到了类似的问题。事实证明,即使您在主目录中创建了junit xml,也必须指定* .xml。 (因此,测试报告XML: .xml ..(或targeted_directory / .xml)。
答案 18 :(得分:0)
我们最近遇到了同样的问题,原来是一个错误的URL,因此标准的403 HTTP响应(显然不是客户端正在寻找的有效XML)。我将分享细节,以防同一个环境中的某个人遇到这个问题:
这是一个基于Spring的Web应用程序,其中“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”是在托管Web应用程序的Tomcat实例的“setenv.sh”中配置的环境变量。文件的内容是这样的:
export END_POINT_BASE_URL="http://localhost:9001/BusinessAppServices"
#export END_POINT_BASE_URL="http://localhost:8765/BusinessAppServices"
失踪的“;”在每一行之后导致格式错误的URL并因此导致错误的响应。也就是说,URL不是“BusinessAppServices / OurService?wsdl”,而是在“/”之前有一个CR。 “TCP / IP Monitor”在解决问题时非常方便。
答案 19 :(得分:0)
我在处理某些XML文件时遇到了同样的问题,我解决了使用ANSI编码读取文件(Windows-1252),并使用Python中的小脚本编写了使用UTF-8编码文件的问题。我尝试使用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()
答案 20 :(得分:0)
我在Mac中解析info.plist
文件时遇到了同样的问题。但是,使用以下命令将文件转换为XML的问题得以解决。
plutil -convert xml1 info.plist
希望可以帮助某人。
答案 21 :(得分:0)
对我来说,构建->清洁修复了所有问题!
答案 22 :(得分:0)
将您的文档设置为以下格式:
<?xml version="1.0" encoding="UTF-8" ?>
<root>
%children%
</root>
答案 23 :(得分:0)
在apache.commons.io中尝试使用BOMInputStream:
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();
}
答案 24 :(得分:0)
我和spring有同样的问题
MarshallingMessageConverter
并通过预处理代码。
Mayby有人需要理由: BytesMessage #readBytes - 读取字节.. ,我忘记了阅读是一个方向操作。 你不能读两遍。
答案 25 :(得分: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);
}
}
}
答案 26 :(得分:0)
即使我遇到过类似的问题。原因是文件开头的一些垃圾字符。
修复:只需在文本编辑器中打开文件(在Sublime文本上测试),删除文件中的任何缩进(如果有),并将文件的所有内容复制粘贴到新文件中并保存。而已!。当我运行新文件时,它运行时没有任何解析错误。
答案 27 :(得分:0)
在我的情况下,我收到此错误,因为我使用的API可以以XML或JSON格式返回数据。当我使用浏览器测试它时,它默认为XML格式,但是当我从Java应用程序调用相同的调用时,API返回了JSON格式的响应,这自然触发了解析错误。
答案 28 :(得分:0)
对未来的另一个想法。获得此错误的情况可能是,当他们将XML窗口作为活动显示并且没有引起注意时,只需随机点击删除键或其他一些键。在我的Web应用程序中使用struts.xml文件之前发生过这种情况。笨笨的肘部......
答案 29 :(得分:0)
我也得到了相同的
XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,2] Message: Reference is not allowed in prolog.
,当我的应用程序为RestFull Webservice调用创建XML响应时。 在创建XML格式字符串时,我将&amp; lt和&amp; gt替换为&lt;和&gt;然后错误消失了,我得到了适当的回应。不确定它是如何工作的但是有效。
<强>样品强>:
String body = "<ns:addNumbersResponse xmlns:ns=\"http://java.duke.org\"><ns:return>"
+sum
+"</ns:return></ns:addNumbersResponse>";
答案 30 :(得分:0)
我遇到了同样的问题。
首先我将XML文件下载到本地桌面,然后在导入文件到门户服务器期间得到Content is not allowed in prolog
。即使是视觉文件对我来说也很好看,但不知怎的,它已经被破坏了。
所以我重新下载了相同的文件,并尝试了相同的文件。