![](/img/trans.png)
[英]org.xml.sax.SAXParseException: Premature end of file for *VALID* XML
[英]org.xml.sax.SAXParseException: Premature end of file
我有这段代码提供给SAXParseError
即,它没有获取内容,但是当我在我的测试 pg 中使用它时,它工作正常。 在这里我提供我的原始代码片段,any1 可以找出问题所在
这是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 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
注意:我可以在我的测试程序中使用相同的路径打开文件
假设这是在 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" )
正如您在上一个问题中向您建议的那样
readFileAsString
方法看起来不错,但如果相信日志 output 则您的应用程序正在读取一个空文件,这就是导致 XML 解析异常的原因。
首先要检查的是您尝试读取的文件的路径名实际上是否正确,并且该位置的文件实际上不是空的。 尝试在readFileAsString
的开头添加这一行
log.info("file size is " + new File(filePath).length());
请注意,零表示文件不存在或为空。
查看代码的 rest ,您的应用程序似乎正在读取文件,对其执行某些操作,然后将其写回同一位置。 考虑可能是生成 output 的代码被破坏了......并且您的应用程序正在尝试读取和解析它之前破坏的文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.