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.