Java Validator блокирует файл в случае сбоя - что я делаю не так?

Я пытаюсь проверить 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 просто сохраняет все ошибки в переменной-члене. Это означает, что валидатор всегда будет успешным и, таким образом, снимет все блокировки входного файла. Однако затем мне нужно проверить обработчик ошибок, чтобы увидеть, были ли ошибки, а затем выдать ошибку, если они были. Это не очень хорошо, но помогает решить эту проблему.

6
задан Phil 17 November 2011 в 17:51
поделиться