繁体   English   中英

org.xml.sax.SAXParseException:*VALID* XML 的文件过早结束

[英]org.xml.sax.SAXParseException: Premature end of file for *VALID* XML

我很奇怪“文件过早结束”。 在我们的一台服务器上的最后几天例外。 相同的配置 XML 在另一台服务器上运行良好。 我们在这两台服务器上都使用 Tomcat 5.0.28。 这段代码已经工作了很长时间(7 年以上),只有在最近的服务器崩溃之后,我们才在其中一台服务器上遇到了这个问题。 XML 和 Java 解析代码没有变化。 :(

我能看到的唯一区别是 Java 版本 -

问题服务器java 版本“1.6.0_16”Java(TM) SE 运行时环境(构建 1.6.0_16-b01)Java HotSpot(TM) 64 位服务器 VM(构建 14.2-b01,混合模式)

工作服务器java 版本“1.6.0_07” Java(TM) SE 运行时环境(构建 1.6.0_07-b06)Java HotSpot(TM) 64 位服务器 VM(构建 10.0-b23,混合模式)

这是已经工作了几年的 Java 代码 -

private void readSource(final InputSource in ) {
    try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(in);
        Element elt = doc.getDocumentElement();

        this.readElement( elt );
    } catch ( Exception ex ) {
        ex.printStackTrace();
        throw new ConfigurationException( "Unable to parse configuration information", ex );
    }
}

这是个例外。

[Fatal Error] :-1:-1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
        at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
        at com.circus.core.Configuration.readSource(Configuration.java:706)

我已经尝试验证 XML 并没有发现任何错误。 知道我还能在哪里寻找可能的问题吗?

任何指针将不胜感激!

TIA, - 马尼什

这是Java InputStream的一个问题。 一旦文件偏移位置计数器移动到文件末尾,就会读取流。 在随后使用相同的流读取时,您将收到此错误。 因此,您必须再次关闭并重新打开流,或调用inputStream.reset()将偏移计数器重置为其初始位置。

这已经解决了。 问题出在其他地方。 cron作业中的另一个代码是将XML截断为0长度文件。 我照顾好了。

只有在解析空字符串/空字节数组时才会发生此异常。

下面是如何重现它的片段:

String xml = ""; // <-- deliberately an empty string.
ByteArrayInputStream xmlStream = new java.io.ByteArrayInputStream(xml.getBytes());
Unmarshaller u = JAXBContext.newInstance(...)
u.setSchema(...);
u.unmarshal( xmlStream ); // <-- here it will fail

在解析之前,请确保您没有在任何地方消耗输入inputstream 示例代码如下:下面的httpresponsehttpresponse (即响应),主要内容包含在StringEntity (ie getEntity())in form of inputStream(ie getContent())

InputStream rescontent = response.getEntity().getContent();
tsResponse=(TsResponse) transformer.convertFromXMLToObject(rescontent );

如果输入流未正确关闭,则可能发生此异常。 确保:如果使用的输入流未以某种方式使用“之前”,那么您打算阅读。 即如果在单个操作中从相同的输入流读取第二次,则第二次调用将获得此异常。 还要确保在finally块或类似的东西中关闭输入流。

您确定XML文件的字符编码正确吗? FileReader始终使用平台默认编码,因此如果“工作”服务器的默认编码为(例如)ISO-8859-1,而“问题”服务器使用UTF-8,如果XML包含任何非错误,您将看到此错误ASCII字符。

如果从FileInputStream而不是FileReader创建InputSource,它是否有效?

在我们的例子中,它是一个空的AndroidManifest.xml

在升级Eclispe时,我们遇到了常见的麻烦 ,AndroidManifest.xml必须在被破坏后由构建脚本检入SVN。

通过从Eclipse内部编译而不是从命令行编译它。

NEW 2021 年 12 月 6 日发生同样的错误!!!

样本跟踪:

XmlBeanDefinitionStoreException: Line -1 in XML document from ServletContext resource [<here a reference to spring context .xml file>] is invalid; nested exception is org.xml.sax.SAXParseException; Premature end of file.
Caused by: org.xml.sax.SAXParseException; Premature end of file.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:201)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:175)
at org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:398)
at org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:325)
at org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:282)
at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:204)
at org.apache.xerces.impl.xs.opti.SchemaParsingConfig.parse(SchemaParsingConfig.java:576)
at org.apache.xerces.impl.xs.opti.SchemaParsingConfig.parse(SchemaParsingConfig.java:679)
at org.apache.xerces.impl.xs.opti.SchemaDOMParser.parse(SchemaDOMParser.java:527)
at org.apache.xerces.impl.xs.traversers.XSDHandler.getSchemaDocument(XSDHandler.java:2148)
at org.apache.xerces.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:557)

提示:

  1. Apache CAMEL 团队决定重新组织 CAMEL 模式文件,例如通常在 XML Spring 上下文中引用的文件。 而不是仅仅删除(这会带来一个简洁的异常,很容易发现) http://camel.apache.org/schema/spring/camel-spring-2.16.4.xsd通常的模式位置,他们实现了一个 HTTP 301将响应重定向到 HTTPS。

  2. Apache XERCES 库不会在 HTTP 301 的情况下抛出错误,而是假设它收到了一个空文件!! 这需要奇怪和错误的异常/让你走上错误的轨道,因为这些报告链接到顶级 XML 文件的失败,而不是实际有问题的模式描述符

  3. 在 WAR 重新加载/部署时(来自数据/内容存储库缓存)在我们的应用程序服务器平台中完全重新验证所有模式描述符及其 XSD 依赖项是完全出乎意料的......而且完全没用! 更糟糕的是:创建运行时公共网络依赖项,以便重新加载已验证的组件和描述符(在构建时)

1+2+3 以上,砰! 主要服务中断:生产服务器无法重新加载依赖于 CAMEL 的任何组件

固定装置:

两位候选人:

a) 在 XML 中的 xsi:schemaLocation 属性中,只需将“s”添加到http://camel.apache.org/schema/etc变成 https://.... 但接受对每个组件的公共网络依赖重新加载

b) 用类路径替换所有 http://... shema 位置:。 您将下载所有 XSD 和子依赖模式,并将它们与 WAR 一起部署,以确保对类加载器的可见性。 例如,将文件放在 java/main/resources/somename.xsd 并提供 classpath:somename.xsd 作为模式位置路径

@berhauz,还有其他评论吗? 我有同样的问题并且没有成功做我已经实现的第一个选项:状态:GracePeriod Blueprint 12/6/21 9:23 PM 缺少依赖项:(&(objectClass=org.apache.aries.blueprint. NamespaceHandler)(osgi.service.blueprint.namespace=https://www.w3.org/2001/XMLSchema-instance))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM