org.xml.sax.SAXParseException:在prolog中不允许使用内容

我有一个基于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) 

这通常是由XML声明之前的空白引起的,但它可以是任何文本 ,如短划线或任何字符。 我经常说白色空间是因为人们认为白色空间总是可以忽略的,但在这里并不是这样。


另一件经常发生的事情是一个UTF-8 BOM (字节顺序标记),在将XML声明作为字符流传递给XML解析器而不是字节流之前,可以将XML声明视为空白。

如果使用模式文件(.xsd)来验证xml文件,而其中一个模式文件具有UTF-8 BOM,则会发生同样的情况。

尝试在prolog中的encoding="UTF-8"字符串和终止?>之间添加一个空格。 在XML中,prolog在文档开始处指定了这个括号 – 问号分隔的元素(而stackoverflow中的标签序言是指编程语言)。

补充:是否在你的文档的序言部分? 这将是错误,在序言前面有数据, -<?xml version="1.0" encoding="UTF-8"?>

其实除了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天,以确定真正的问题。

我尝试使用freemarker解析XML文档时遇到了同样的问题(并解决了这个问题)。

我在XML文件的标题之前没有空格。

当且仅当文件编码和XML编码属性不同时,才会出现问题 (例如:头中有UTF-16属性的UTF-8文件)。

所以我有两种解决问题的方法:

  1. 改变文件本身的编码
  2. 将标题UTF-16更改为UTF-8

这意味着XML格式不正确或响应主体根本不是XML文档。

只花了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文件,有时你可以看到在文本编辑器没有显示的文件开头的附加字节。

删除它们,你的XML将被解析。

在我的情况下,删除'encoding =“UTF-8”'属性一起工作。

它看起来像一个字符集编码问题,也许是因为你的文件不是真正的UTF-8。

正如Mike Sokolov已经指出的那样,其中一个可能的原因是在标签之前出现了一些字符(例如空格)。

如果您的输入XML正在被读为String(而不是字节数组),那么您可以使用下面的代码替换您的输入字符串,以确保xml标签之前的所有'不必要的'字符被清除。

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

您需要确保输入xml始于xml标记。

如果一切都失败了,用二进制打开这个文件,以确保在文件的开头没有有趣的字符[文件开头的3个不可打印的字符,标识文件为utf-8]。 我们做了这个,发现了一些。 所以我们将文件从utf-8转换为ascii,它工作。

对于同样的问题,我已经删除了以下行,

  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位和Java * jdk1.6.0_13 *的Netbeans IDE。 不知道它是如何工作的。

我遵循这里找到的指示,我得到了同样的错误。

我在记事本和XML记事本中尝试了几件事来解决它(即更改编码,输入XML文件而不是复制粘贴等),但没有任何工作。

问题得到解决,当我编辑和保存我的XML文件在Notepad ++(编码 – > UTF-8没有BOM)

对于所有那些得到这个错误:警告:Catalina.start使用conf / server.xml:内容不允许在prolog。

不是很丰富..但是这实际上意味着你的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这意味着“没有字节顺序标记”

希望这可以帮助那里的人!

只是对未来的这一个更多的思考。 得到这个错误可能是这样的情况,即当他们有一个XML窗口作为活动显示并且没有注意时,他们只是简单地点击删除键或其他一些键。 这发生在我以前在我的web应用程序中的struts.xml文件。 笨拙的肘部…

我也是一样的

XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,2] Message: Reference is not allowed in prolog.

,当我的应用程序正在创建RestFull Web服务调用的XML响应。 在创建XML格式的字符串时,我用<和>替换&lt&gt,然后错误消失了,我得到了正确的响应。 不知道它是如何工作,但它的工作。

样本

 String body = "<ns:addNumbersResponse xmlns:ns=\"http://java.duke.org\"><ns:return>" +sum +"</ns:return></ns:addNumbersResponse>"; 

我遇到过同样的问题。

首先,我将XML文件下载到本地桌面,并且在将文件导入门户网站服务器期间,我Content is not allowed in prologContent is not allowed in prolog 。 即使在视觉上文件看起来不错,但不知何故,它已经损坏。

所以我重新下载相同的文件,并尝试相同的,它的工作。

最近我们遇到了同样的问题,事实证明,这是一个错误的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,从而导致不良响应。 也就是说,而不是“BusinessAppServices / OurService?wsdl”该URL在“/”之前有一个CR。 “TCP / IP监视器”在解决问题时非常方便。

在我的情况下,我得到了这个错误,因为我使用的API可以返回XML或JSON格式的数据。 当我使用浏览器对其进行测试时,默认为XML格式,但是当我从Java应用程序调用相同的调用时,API返回了JSON格式的响应,这自然触发了解析错误。

即使我也面临类似的问题。 原因是文件开头的一些垃圾字符。

修复:只需在文本编辑器中打开文件(在Sublime文本上测试),删除文件中的任何缩进,然后将文件的所有内容粘贴到新文件中并保存。 而已!。 当我运行新文件时,它运行时没有任何分析错误。

我把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 version="1.0" encoding="UTF-8" ?> <root> %children% </root>