Function Saxon解析器的自定义URI解析器中的句柄流
我必须根据xslt处理xml,结果文档创建了许多xml。 正如这里所建议的: 我编写了我的个人URI解析器:Function Saxon解析器的自定义URI解析器中的句柄流,function,xslt,external,saxon,Function,Xslt,External,Saxon,我必须根据xslt处理xml,结果文档创建了许多xml。 正如这里所建议的: 我编写了我的个人URI解析器: public class CustomOutputURIResolver implements OutputURIResolver{ private File directoryOut; public CustomOutputURIResolver(File directoryOut) { super(); this.director
public class CustomOutputURIResolver implements OutputURIResolver{
private File directoryOut;
public CustomOutputURIResolver(File directoryOut) {
super();
this.directoryOut = directoryOut;
}
public void close(Result arg0) throws TransformerException {
}
public Result resolve(String href, String base) throws TransformerException {
FileOutputStream fout = null;
try {
File f = new File(directoryOut.getAbsolutePath() + File.separator + href + File.separator + href + ".xml");
f.getParentFile().mkdirs();
fout = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return new StreamResult(fout);
}
}
获取输出目录,然后将文件保存在此处
但是当我在junit中测试它时,我在清理阶段遇到了一些问题,当我试图删除创建的文件时,我注意到FileOutputStream fout没有得到很好的处理。
试图解决这个问题给了我一些想法:
首先我提出了这个想法:
public class CustomOutputURIResolver implements OutputURIResolver{
private File directoryOut;
private FileOutputStream fout
public CustomOutputURIResolver(File directoryOut) {
super();
this.directoryOut = directoryOut;
this.fout = null;
}
public void close(Result arg0) throws TransformerException {
try {
if (null != fout) {
fout.flush();
fout.close();
fout = null;
}
} catch (Exception e) {}
}
public Result resolve(String href, String base) throws TransformerException {
try {
if (null != fout) {
fout.flush();
fout.close();
}
} catch (Exception e) {}
fout = null;
try {
File f = new File(directoryOut.getAbsolutePath() + File.separator + href + File.separator + href + ".xml");
f.getParentFile().mkdirs();
fout = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return new StreamResult(fout);
}
}
因此,只要打开另一个fileOutputStream,就会关闭fileOutputStream。
但是:
1) 我不太喜欢这个解决方案
2) 如果在多线程进程中调用此函数会怎么样?(我对Saxon解析不是很熟练,所以我真的不知道……)
3) 是否有机会为每个解析创建和处理一个FileOutputStream?close()使用Result参数的原因是为了确定要关闭的流。为什么不:
public void close(Result arg0) throws TransformerException {
try {
if (arg0 instanceof StreamResult) {
OutputStream os = ((StreamResult)arg0).getOutputStream();
os.flush();
os.close();
}
} catch (Exception e) {}
}
从Saxon EE 9.5开始,xsl:result文档在新线程中执行,因此OutputURIResolver应该是线程安全的,这一点非常重要。由于这一变化,从9.5开始,OutputURIResolver必须实现一个额外的方法getInstance(),这使得管理状态更加容易:如果newInstance()方法实际创建了一个新实例,那么每个正在处理的结果文档都将有一个OutputURIResolver实例,它可以保存输出流,并在请求时关闭它。没错。。出于某种原因,我认为close函数只在整个过程结束时才被调用,我没有注意它的参数。。现在我已经整理好了代码,效果很好,谢谢!