简体   繁体   中英

org.xml.sax.SAXParseException: Premature end of file

I have this piece of code which gives to SAXParseError ie, it is not getting the content, but the same thing when i use in my test pg it works correctly. Here i am providing my original code piece, can any1 figure out what is the problem

This is the part where I fetch a xml and append a node to it but it seems that i am not able to get the file itself

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)

my readFileAsString function

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);
    }
}

Output

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

Note : I am able to open the file in my test program with the same path

Assuming this is in Groovy, I believe you can replace all of your code with:

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

But I repeat , doing this inside a web application is probably a bad idea as if two threads call this code at the same time, the file is going to be unpredictable (and get more unpredictable as it gets larger)

Also, you might want to change:

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

to

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

As suggested to you in a previous question of yours

The readFileAsString method looks OK, but if the log output is to believed then your application is reading an empty file, and that's what is causing the XML parse exception.

The first thing to check is that the pathname of the file you are attempting to read is actually correct, and that the file at that location is not actually empty. Try adding this line at the beginning of readFileAsString

log.info("file size is " + new File(filePath).length());

Note that zero means either the file does not exist, or it is empty.


Looking at the rest of the code, your application seems to be reading the file, doing something to it and then writing it back to the same place . Consider the possibility that it is the code that is generating the output that is broken... and your application is attempting to read and parse a file that it has previously clobbered.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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