org.xml.sax.SAXParseException:文件过早结束

时间:2011-06-02 09:59:08

标签: java groovy

我有这段代码给了SAXParseError,即它没有得到内容,但是当我在我的测试中使用它时,它也能正常工作。在这里,我提供我的原始代码片,可以任意1找出问题是什么

这是I fetch a xml and append a node to it的部分,但似乎我无法获取文件本身

String atemp=readFileAsString("../webapps/abc/include/xml/data.xml")

        log.info("ok thats good")

        String[] splitString=res.split(",")

        log.info(atemp)

        try
        {
            def root = new XmlSlurper().parseText(atemp)
        }
        catch(Exception e)
        {
            log.debug("parse errror: "+e)
        }
        root.appendNode {
          row {
            name(splitString[1])
            host(splitString[2])
            desc(splitString[3])
            product(splitString[4])
            type(splitString[5])
            time(splitString[6])
            by(splitString[7])
          }
        }

        def outputBuilder = new StreamingMarkupBuilder()
        String temp = outputBuilder.bind{ mkp.yield root }

        File file = new File("../webapps/abc/include/xml/data.xml");
        BufferedWriter output = new BufferedWriter(new FileWriter(file));
        output.write(temp);
        output.close();
        log.info(temp)

我的 readFileAsString 功能

private String readFileAsString(String filePath) {
    try
    {
        StringBuffer fileData = new StringBuffer();
        BufferedReader reader = new BufferedReader(new FileReader(filePath));
        log.info(reader==null);
        char[] buf = new char[1024];
        int numRead=0;
        while((numRead=reader.read(buf)) != -1){
            String readData = String.valueOf(buf, 0, numRead);
            fileData.append(readData);
            log.info(readData)
        }
        reader.close();
        log.info("File Content\n"+fileData.toString());
        return fileData.toString();
    }
    catch (Exception e) 
    {
        log.info(e);
    }
}

输出

INFO http-5050-Processor24 com.abc.helper.WriteXml - false
INFO http-5050-Processor24 com.abc.helper.WriteXml - File Content
INFO http-5050-Processor24 com.abc.helper.WriteXml - ok thats good

注意:我可以使用相同的路径在我的测试程序中打开文件

2 个答案:

答案 0 :(得分:1)

假设这是在Groovy中,我相信您可以用以下代码替换所有代码:

File f = new File( '../webapps/abc/include/xml/data.xml' )
def root = new XmlSlurper().parse( f )
String[] splitString = res.split( ',' )
root.appendNode {
  row {
    name(splitString[1])
    host(splitString[2])
    desc(splitString[3])
    product(splitString[4])
    type(splitString[5])
    time(splitString[6])
    by(splitString[7])
  }
}
def outputBuilder = new StreamingMarkupBuilder()
String newXml = outputBuilder.bind{ mkp.yield root }
f.text = newXml

但我重复,在Web应用程序中执行此操作可能是一个坏主意,就好像两个线程同时调用此代码一样,该文件将无法预测(并获取更多不可预测,因为它变得更大)

此外,您可能想要更改:

File f = new File( '../webapps/abc/include/xml/data.xml' )

File f = new File( "${System.properties['catalina.base']}/webapps/abc/include/xml/data.xml" )

根据您的建议in a previous question of yours

答案 1 :(得分:0)

readFileAsString方法看起来没问题,但是如果相信日志输出那么你的应用程序正在读取一个空文件,那就是导致XML解析异常的原因。

要检查的第一件事是您尝试读取的文件的路径名实际上是正确的,并且该位置的文件实际上不是空的。尝试在readFileAsString

的开头添加此行
log.info("file size is " + new File(filePath).length());

请注意,零表示文件不存在,或者表示为空。


查看其余代码,您的应用程序似乎正在读取文件,对其执行某些操作,然后将其写回到同一个地方。考虑可能是生成输出的代码被破坏......并且您的应用程序正在尝试读取并解析先前已经破坏过的文件。