我有一个基于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)
27 回答
尝试使用freemarker解析XML文档时,我遇到了同样的问题(并解决了它) .
我在XML文件的 Headers 之前没有空格 .
当且仅当文件编码和XML编码属性不同时,才会出现此问题 . (例如:头文件中带有UTF-16属性的UTF-8文件) .
所以我有两种解决问题的方法:
更改文件本身的编码
将 Headers UTF-16更改为UTF-8
我也是如此
XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,2] Message: Reference is not allowed in prolog.
,当我的应用程序为RestFull Webservice调用创建XML响应时 . 在创建XML格式字符串时,我将&lt和&gt替换为<和>,然后错误消失,我得到了正确的响应 . 不知道它是如何工作但它的工作原理 .
sample :
这通常是由XML声明之前的空格引起的,但它可能是 any text ,就像破折号或任何字符一样 . 我说经常是由白色空间引起的,因为人们认为白色空间总是可以忽略不计,但事实并非如此 .
经常发生的另一件事是 UTF-8 BOM (字节顺序标记),如果将文档作为字符流传递给XML解析器而不是字节流,则可以将XML声明视为空格之前允许这样做 .
如果使用模式文件(.xsd)来验证xml文件,并且其中一个模式文件具有 UTF-8 BOM ,则会发生同样的情况 .
实际上除了Yuriy Zubarev的帖子
将不存在的xml文件传递给解析器时 . 例如,你通过
当您的文件系统上只存在C:/temp/abc.xml文件时
在任一情况下
要么
所有都给出相同的错误信息 .
非常令人失望的bug,因为下面的痕迹
没有说'文件名不正确'或'这样的文件不存在'的事实 . 在我的情况下,我有绝对正确的xml文件,不得不花了2天来确定真正的问题 .
尝试在prolog中的
encoding="UTF-8"
字符串和终止?>
之间添加一个空格 . 在XML中,prolog在文档的开头指定这个括号 - 问号分隔元素(而stackoverflow中的标记prolog指的是编程语言) .Added: 那个破折号是在文档的prolog部分前面吗?那将是那里的错误,在序言前面有数据,
-<?xml version="1.0" encoding="UTF-8"?>
.这意味着XML格式错误或响应正文根本不是XML文档 .
花了4个小时跟踪WSDL中的类似问题 . 结果是WSDL使用了一个导入另一个命名空间XSD的XSD . 此导入的XSD包含以下内容:
注意空的
include
元素!这是我的困境的根源 . 我想这是上面没有找到Egor文件的变种问题 .1令人失望的错误报告 .
就我而言,删除'encoding =“UTF-8”'属性完全有效 .
它看起来像一个字符集编码问题,可能是因为你的文件不是真正的UTF-8 .
我的答案可能对你没有帮助,但它一般有助于解决这个问题 .
当您看到这种异常时,您应该尝试在任何十六进制编辑器中打开您的xml文件,有时您可以在文件开头看到文本编辑器未显示的其他字节 .
删除它们,你的xml将被解析 .
如果所有其他方法都失败了,请打开二进制文件,以确保文件开头没有有趣的字符[文件开头有3个不可打印的字符,标识文件为utf-8] . 我们这样做了,发现了一些 . 所以我们将文件从utf-8转换为ascii并且它有效 .
对于同样的问题,我删除了以下行,
它工作正常 . 不太确定为什么UTF-8会出现问题 . 为了让我感到震惊,它也可以用于UTF-8 .
使用Windows-7 32位和Netbeans IDE与Java * jdk1.6.0_13 * . 不知道它是如何工作的 .
正如Mike Sokolov已经指出的那样,其中一个可能的原因是在标签之前存在一些字符(例如空格) .
如果您的输入XML被读取为String(而不是字节数组),那么您可以使用以下代码替换输入字符串,以确保擦除xml标记之前的所有“不必要”字符 .
您需要确保输入xml以xml标记开头 .
我按照发现here的说明,我得到了同样的错误 .
我在Notepad和XML Notepad中尝试了几种方法来解决它(即更改编码,键入XML文件而不是复制粘贴等),但没有任何效果 .
当我在记事本中编辑并保存我的XML文件时,问题得到了解决(编码 - > utf-8没有BOM)
对于所有收到此错误的人:警告:使用conf / server.xml的Catalina.start:prolog中不允许使用内容 .
信息量不大..但实际上这意味着你的conf / server.xml文件中有垃圾 .
我在其他XML文件中看到了这个确切的错误 . 这个错误可能是由文本编辑器进行更改引起的介绍垃圾 .
验证文件中是否有垃圾的方法是使用“HEX编辑器”打开它如果在此字符串之前看到任何字符
像这样会是垃圾
这是你的问题....解决方案是使用一个好的HEX编辑器..一个允许您保存具有不同类型的编码的文件..
然后将其保存为UTF-8 . 某些使用XML文件的系统可能需要将其保存为UTF NO BOM这意味着使用“NO Byte Order Mark”
希望这有助于那里的人!
有时它是代码,而不是XML
以下代码,
也会导致此错误,
因为它试图解析字符串文字
"file.xml"
(不是file.xml
文件的内容)而失败,因为"file.xml"
作为字符串不是格式良好的XML .Fix: Remove StringReader():
同样,脏缓冲区问题可能会在实际XML之前留下残留垃圾 . 如果您仔细检查了XML并仍然收到此错误,请记录传递给解析器的确切内容;有时实际上(试图)解析的是令人惊讶的 .
在我的情况下,我的应用程序中的web.xml有额外的空间,即使我删除后没有工作,我不得不恢复chages及其修复,是的,我在我的tomcat中使用 logging.properties 和 web.xml ,但即使我恢复错误后仍然显示如此这固定了)) .
具体我尝试添加 org.apache.catalina.filters.ExpiresFilter.level = FINE stack over flow something about logging.properties
首先清理项目,然后重建项目 . 我也面临同样的问题 . 在此之后一切都好了 .
只是对未来的另一个想法 . 获得此错误的情况可能是,当一个XML窗口作为活动显示并且没有引起注意时,只需随机点击删除键或其他一些键 . 在我的Web应用程序中使用struts.xml文件之前发生过这种情况 . 笨笨的肘部......
我遇到过同样的问题 .
首先我将XML文件下载到本地桌面,然后在导入文件到门户服务器期间得到
Content is not allowed in prolog
. 即使是视觉文件对我来说看起来也不错,但不知怎的,它已经被破坏了 .所以我重新下载相同的文件,并尝试相同,它的工作原理 .
我们最近遇到了同样的问题,原来是一个错误的URL,因此标准的403 HTTP响应(显然不是客户端正在寻找的有效XML) . 我将分享细节,以防同一个上下文中的某个人遇到此问题:
这是一个基于Spring的Web应用程序,其中“JaxWsPortProxyFactoryBean”bean配置为公开远程端口的代理 .
“END_POINT_BASE_URL”是在托管Web应用程序的Tomcat实例的“setenv.sh”中配置的环境变量 . 文件的内容是这样的:
失踪的“;”在每一行之后导致格式错误的URL并因此导致错误的响应 . 也就是说,URL不是“BusinessAppServices / OurService?wsdl”,而是在“/”之前有一个CR . 在解决问题时,“TCP / IP Monitor”非常方便 .
在我的情况下,我收到此错误,因为我使用的API可以以XML或JSON格式返回数据 . 当我使用浏览器测试它时,它默认为XML格式,但是当我从Java应用程序调用相同的调用时,API返回了JSON格式的响应,这自然触发了解析错误 .
即使我遇到过类似的问题 . 原因是文件开头的一些垃圾字符 .
修复:只需在文本编辑器中打开文件(在Sublime文本上测试),删除文件中的任何缩进(如果有),并将文件的所有内容复制粘贴到新文件中并保存 . 而已! . 当我运行新文件时,它运行时没有任何解析错误 .
我接受了Dineshkumar的代码并修改为正确验证我的XML文件:
将文档设置为如下形式:
我和 Spring 天有同样的问题
并通过预处理代码 .
Mayby有人需要理由: BytesMessage #readBytes - reading bytes.. 我忘记了阅读是一个方向操作 . 你不能读两遍 .
在apache.commons.io中尝试使用BOMInputStream:
对我来说, Build->Clean 修复了一切!