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