【发布时间】:2011-11-17 16:02:22
【问题描述】:
我正在尝试根据 Java 中的模式验证 XML 文件,问题是如果文件验证失败,则文件将被锁定,直到应用程序终止。如果输入文件有效,则文件不会被锁定,一切都很好。
我正在使用javax.xml.validation.Validator 和validate() 方法。这看起来很简单,并且在验证通过时很好。我只能假设我在错误处理中遗漏了一些东西,但 Validator 的 API 似乎没有提供任何有用的东西。谁能解释我在这里做错了什么?
我已将所有这些简化为下面的一个独立类。如果您在扫描程序启动时运行此程序,请检查输入文件,您可以看到它现在已被锁定。如果您需要,我可以提供输入和结构文件。
谢谢,
菲尔
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.net.URI;
import java.util.Scanner;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
public class ValidationTest {
public static void validate(URI xmlLocation, URI schemaLocation) throws Exception {
SchemaFactory schemaFactory = SchemaFactory.newInstance( "http://www.w3.org/2001/XMLSchema" );
Source schemaSource = new StreamSource(schemaLocation.toString());
Schema schema = schemaFactory.newSchema(schemaSource);
Validator schemaValidator = schema.newValidator();
StreamSource source = new StreamSource(xmlLocation.getPath());
schemaValidator.validate( source );
}
public static void main(String[] args) throws Exception {
File srcFile = new File("c:/aaa/MySrc-Broken.xml");
File schema = new File("c:/aaa/MyStructureDefinition.xsd");
try {
ValidationTest.validate(srcFile.toURI(), schema.toURI());
} catch(Exception e) {
System.err.println(e);
}
// Use a Scanner to pause the thread, so that I can
// go and check the file's permissions.
Scanner scan = new Scanner(System.in);
scan.nextLine();
}
}
更新:
我有一点技巧,它提供了一个(坏的)解决方案。我将自定义 errorHandler 添加到 schemaValidator。此 errorHandler 仅将任何错误存储在成员变量中。这意味着验证器将始终成功,从而释放输入文件上的所有锁。但是,我必须检查错误处理程序以查看是否有任何错误,如果有则抛出错误。这不是很好,但确实让我解决了这个问题。
【问题讨论】:
-
我也遇到过这个问题(主要是在 Windows LOL 上),我认为这是一个 JDK 错误...
标签: java xml validation