[英]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
。 示例代码如下:下面的httpresponse
是httpresponse
(即响应),主要内容包含在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)
提示:
Apache CAMEL 团队决定重新组织 CAMEL 模式文件,例如通常在 XML Spring 上下文中引用的文件。 而不是仅仅删除(这会带来一个简洁的异常,很容易发现) http://camel.apache.org/schema/spring/camel-spring-2.16.4.xsd通常的模式位置,他们实现了一个 HTTP 301将响应重定向到 HTTPS。
Apache XERCES 库不会在 HTTP 301 的情况下抛出错误,而是假设它收到了一个空文件!! 这需要奇怪和错误的异常/让你走上错误的轨道,因为这些报告链接到顶级 XML 文件的失败,而不是实际有问题的模式描述符
在 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.