Prolog SAXParserException 中不允许内容

Posted

技术标签:

【中文标题】Prolog SAXParserException 中不允许内容【英文标题】:Content is not allowed in Prolog SAXParserException 【发布时间】:2011-06-01 22:22:15 【问题描述】:

我正在尝试调用 Web 服务,但遇到了奇怪的行为。我们在我的服务器上运行了一个网络服务,但是代码不对我们开放,所以看不到墙后面发生了什么 该服务的所有者公开了基于 Web 的测试客户端 UI,该 UI 在文本框中接受输入,并将显示对测试目的的响应。此输入框以下面提到的格式接受输入

<CONTENT>
 <CONTENTID></CONTENTID>
 <DOCUMENTID>DRI2</DOCUMENTID>
 <LOCALECODE>en_US</LOCALECODE>
 <LATEST_VERSION>false</LATEST_VERSION>
 <INCREASEVIEWCOUNT>false</INCREASEVIEWCOUNT>
 <ACTIVITY_TYPE></ACTIVITY_TYPE>
</CONTENT>

它在这个 UI 上工作正常,但是当我试图通过我的 java 代码调用这个 Web 服务时,它得到连接以及得到服务的授权,但是当我试图调用上述方法时,它给了我以下错误消息

AxisFault
 faultCode: http://schemas.xmlsoap.org/soap/envelope/Server.userException
 faultSubcode: 
 faultString: org.xml.sax.SAXParseException: Content is not allowed in prolog.
 faultActor: 
 faultNode: 
 faultDetail: 
 http://xml.apache.org/axis/stackTrace: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 org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
 at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
 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.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
 at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
 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)
 at com.inquira.imwows.generated.ContentServicesSoapBindingStub.getContentRecord(ContentServicesSoapBindingStub.java:262)
 at com.inquira.prep.GetWebService.getcontentRecord(GetWebService.java:87)
 at com.inquira.prep.TestWs.main(TestWs.java:13)

 http://xml.apache.org/axis/hostname:umeshawasthi

org.xml.sax.SAXParseException: Content is not allowed in prolog.
 at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
 at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:701)
 at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
 at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
 at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
 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)
 at com.inquira.imwows.generated.ContentServicesSoapBindingStub.getContentRecord(ContentServicesSoapBindingStub.java:262)
 at com.inquira.prep.GetWebService.getcontentRecord(GetWebService.java:87)
 at com.inquira.prep.TestWs.main(TestWs.java:13)
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 org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
 at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
 at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
 at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
 ... 11 more

下面是生成所需 XML 的代码

inputXml.append("<CONTENT>");
   inputXml.append("<CONTENTID>").append("</CONTENTID>");
   inputXml.append("<DOCUMENTID>").append("DRI2").append("</DOCUMENTID>");
   inputXml.append("<LOCALECODE>").append("en_US").append("</LOCALECODE>");
   inputXml.append("<LATEST_VERSION>").append("false").append("</LATEST_VERSION>");
   inputXml.append("<INCREASEVIEWCOUNT>").append("false").append("</INCREASEVIEWCOUNT>");
   inputXml.append("<ACTIVITY_TYPE>").append("</ACTIVITY_TYPE>");
   inputXml.append("</CONTENT>");

生成的XML如下

<CONTENT><CONTENTID></CONTENTID><DOCUMENTID>DRI2</DOCUMENTID><LOCALECODE>en_US</LOCALECODE><LATEST_VERSION>false</LATEST_VERSION><INCREASEVIEWCOUNT>false</INCREASEVIEWCOUNT><ACTIVITY_TYPE></ACTIVITY_TYPE></CONTENT>

我什至对生成的字符串进行了计时,如下所示

inputXml.toString().trim().replaceFirst("^([\\W]+)<","<");

但无法找出问题所在,我确信输入 XML 中存在一些问题,因为它在相同 XML 的测试页面 UI 上的工作发现

在这方面的任何帮助都非常有用

【问题讨论】:

在将 XML 文件保存为带有 BOM 的 UTF-8 时收到此类错误消息。您在哪里以及如何初始化 inputXML 对象? 尝试在顶部添加这个&lt;?xml version="1.0" encoding="UTF-8"?&gt; @Org.life.java: 我也试过这个东西没用:( @Welteraumpirat:_content.getContentRecord(_token,test);这是他们提供的服务方法,它接受两个参数作为字符串类型 org.xml.sax.SAXParseException: Content is not allowed in prolog的可能重复 【参考方案1】:

此错误可能与实际 XML 内容之前的字节顺序标记 (BOM) 有关。您需要解析返回的 String 并丢弃 BOM,这样 SAXParser 才能正确处理文档。

你会找到一个可能的解决方案here。

【讨论】:

我通过在十六进制编辑器中查看我的文件来检查此“BOM”是否存在。 ef bb bf 标记了前 3 个字节 好的,但是有没有办法用 SAX 解析器做到这一点?在输入 SAX(处理程序)之前,我们是否必须自己删除 BOM?【参考方案2】:

要简单地删除它,请将您的 xml 文件粘贴到记事本中,您会在第一个标签之前看到多余的字符。将其删除并粘贴回您的文件中 - bof

【讨论】:

【参考方案3】:

检查 XML。它不是有效的 xml。

Prolog 是带有 xml 版本信息的第一行。没关系 将其包含在您的 xml 中。

当解析器在文档开头读取无效标签时会引发此错误。通常是序言所在的位置。

例如

    根/>

【讨论】:

Prolog 不是编程语言???好的,我完全误解了“Prolog 中不允许内容”的消息!【参考方案4】:

如果您的 wsdl 或 xsd 文件中存在验证错误,则可能会出现此错误。例如,在运行 wsdl2java 以转换我的 wsdl 文件以生成客户端时,我也遇到了同样的问题。 在我的一个 xsd 中,它的定义如下

<xs:import schemaLocation="" namespace="http://MultiChoice.PaymentService/DataContracts" />

schemaLocation 为空的位置。通过在 schemaLocation 中提供正确的数据解决了我的问题。

<xs:import schemaLocation="multichoice.paymentservice.DataContracts.xsd" namespace="http://MultiChoice.PaymentService/DataContracts" />

【讨论】:

【参考方案5】:

我遇到了同样的问题。我们的应用程序在四个应用程序服务器上运行,并且由于其中一个 Web 服务 WSDL 中提到的无效模式位置,在服务器上生成了挂起的线程。应用程序经常下降。更正架构 Location 后,问题得到解决。

【讨论】:

以上是关于Prolog SAXParserException 中不允许内容的主要内容,如果未能解决你的问题,请参考以下文章

Prolog语言

无法使用 GNU-Emacs 在 SWI-Prolog 上编辑“Prolog 程序名称”(尝试设置劣质 Prolog 进程)

[prolog 基础系列] Prolog 的使用以及 Knowledge Base

Prolog 网络编程

人工智能导论prolog编程题目

Prolog =:= 运算符