Я пытаюсь проверить XML-файл на соответствие схеме в Java, и проблема в том, что если проверка файла не удалась, то файл блокируется до завершения работы приложения. Если входной файл был действительным, то файл не блокируется и все в порядке.
Я использую метод javax.xml.validation.Validator
и validate ()
. Это кажется достаточно простым и нормально, когда проверка проходит. Я могу только предположить, что мне что-то не хватает в моей обработке ошибок, но API для Validator, похоже, не предоставляет ничего, что было бы полезно. Может ли кто-нибудь пролить свет на то, что я здесь делаю неправильно?
Я упростил все это в отдельный класс ниже.Если вы запустите это, тогда в момент запуска сканера проверьте входной файл, и вы увидите, что теперь он заблокирован. Я могу предоставить входной файл и файл структуры, если он вам потребуется.
Спасибо,
Фил
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 просто сохраняет все ошибки в переменной-члене. Это означает, что валидатор всегда будет успешным и, таким образом, снимет все блокировки входного файла. Однако затем мне нужно проверить обработчик ошибок, чтобы увидеть, были ли ошибки, а затем выдать ошибку, если они были. Это не очень хорошо, но помогает решить эту проблему.