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

时间:2012-06-20 07:20:32

标签: java xml xml-parsing

我变得非常奇怪"文件过早结束。"我们的一台服务器上的最近几天例外。 相同的配置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, - Manish

7 个答案:

答案 0 :(得分:59)

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

答案 1 :(得分:20)

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

答案 2 :(得分:14)

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

下面的

是关于如何重现它的片段:

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

答案 3 :(得分:4)

在解析之前,请确保您没有在任何地方消费inputstream。示例代码如下: 下面的设置是httpresponse(即响应),主要内容包含在StringEntity (i.e. getEntity())in form of inputStream(i.e. getContent())内。

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

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

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