org.xml.sax.SAXParseException:序言中不允许内容

新手上路,请多包涵

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

原文由 ag112 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

这通常是由 XML 声明之前的空格引起的,但它可以是 任何文本,例如破折号或任何字符。我说通常是由空白引起的,因为人们认为空白总是可以忽略的,但事实并非如此。


另一件经常发生的事情是 UTF-8 BOM (字节顺序标记),如果将文档作为字符流而不是字节流传递给 XML 解析器, 在 XML 声明可以被视为空白之前允许这样做.

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

原文由 Mike Sokolov 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 Egor 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题