我编写了一个程序来验证文件夹中存在的所有xml并报告失败的文件。我在程序中使用了java XML验证器实用程序。
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new File("xsdPath"));
我有一个xml文件列表,我在循环中验证
for (int i = 0; i < list.size(); i++) {
String returnValue = validateXML(list.get(i));
...
}
然后我有一个验证XML的功能
public static String validateXML(String xmlPath){
try {
validator = schema.newValidator();
validator.validate(new StreamSource(new File(xmlPath)));
} catch (IOException e) {
...
}
如果上述函数超出了设置的最大文件数的系统限制,则会返回太多打开的文件错误。
如果我使用ulimit -n 3000更改linux参数,那么它的工作正常。我想知道我们是否可以使用不同的方法来验证java代码本身的XML,这样我就不需要更改系统参数。
答案 0 :(得分:2)
您可能希望跟踪基础InputStream
,以便在完成后关闭它:
public static String validateXML(String xmlPath){
BufferedInputStream xmlStream = null;
try {
validator = schema.newValidator();
xmlStream=new BufferedInputStream(new FileInputStream(xmlPath));
Source src=new StreamSource(xmlStream);
validator.validate(src);
} catch (IOException e) {
// do something
}
finally{
if(xmlStream != null){
try{
xmlStream.close();
}
catch(Exception e){
// error while closing
}
}
}
}
答案 1 :(得分:2)
@Berger在他的回答中是正确的,但是如果您使用的是Java 7或更高版本,则可以使用try-with-resource功能来显着减少样板异常和资源处理代码:
public static String validateXML(String xmlPath){
validator = schema.newValidator();
try (BufferedInputStream xmlStream = new BufferedInputStream(new FileInputStream(xmlPath))) {
validator.validate(new StreamSource(xmlStream));
} catch (IOException e) {
// do something
}
}
此处有更多详情: