Tôi đang cố gắng xác nhận hợp lệ tệp XML dựa vào lược đồ trong Java và vấn đề là nếu xác thực tệp không thành công, thì tệp sẽ bị khóa cho đến khi ứng dụng chấm dứt. Nếu tệp đầu vào hợp lệ thì tệp không bị khóa và mọi thứ đều ổn.Trình xác thực Java khóa tệp khi không thành công - tôi đang làm gì sai?
Tôi đang sử dụng phương thức javax.xml.validation.Validator
và validate()
. Điều này có vẻ đơn giản, đủ và là tốt khi xác nhận đi. Tôi chỉ có thể giả định rằng tôi đang thiếu một cái gì đó trong xử lý lỗi của tôi, nhưng API cho Validator dường như không cung cấp bất cứ thứ gì có ích. Có ai có thể làm sáng tỏ những gì tôi đang làm sai ở đây không?
Tôi đã đơn giản hóa tất cả điều này thành một lớp độc lập bên dưới. Nếu bạn chạy điều này thì tại thời điểm khi máy quét bắt đầu, hãy kiểm tra tệp đầu vào và bạn có thể thấy rằng nó đang bị khóa. Tôi có thể cung cấp một tập tin đầu vào và cấu trúc nếu bạn cần nó.
Cảm ơn,
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();
}
}
Cập nhật:
Tôi có một chút của một hack mà cung cấp một (xấu) giải pháp. Tôi thêm một errorHandler tùy chỉnh vào schemaValidator. ErrorHandler này chỉ lưu trữ bất kỳ lỗi nào trong một biến thành viên. Điều này có nghĩa là trình duyệt tính hợp lệ sẽ luôn thành công và do đó giải phóng tất cả các khóa trên tệp đầu vào. Tuy nhiên sau đó tôi phải kiểm tra xử lý lỗi để xem nếu có bất kỳ lỗi nào và sau đó ném một lỗi nếu có. Đây không phải là tuyệt vời nhưng làm cho tôi tròn vấn đề này.
Điều này có vẻ như là một giải pháp cho một lỗi - vâng? –
Hoặc đó là nguyên nhân gây ra bởi OP sử dụng các lớp không chính xác. Tôi đã không sử dụng StreamSources cá nhân nên không có thêm lời khuyên để cung cấp - nhưng một tập tin bị khóa tương đương với một tập tin chưa được phát hành, và ứng cử viên duy nhất tôi thấy ở trên là đối tượng StreamSource. – mcfinnigan
Nó có vẻ giống như một lỗi ... "nếu xác nhận của tập tin không thành công, sau đó tập tin sẽ bị khóa cho đến khi ứng dụng chấm dứt. Nếu tập tin đầu vào là hợp lệ thì tập tin không bị khóa và mọi thứ đều ổn." IMHO tập tin phải luôn luôn bị khóa hoặc phát hành độc lập với kết quả.Vui lòng sửa quan niệm của tôi nếu tôi sai – Pitelk