2012-06-21 33 views
26

Tôi có một mã tiêu chuẩn như dưới đây để xác nhận xml dựa vào xsd, nhưng nó ném ngoại lệ vào lỗi đầu tiên và dừng lại. Làm thế nào để xác nhận xml, nhưng tiếp tục trên các lỗi đầu tiên và tiếp theo và nhận được tất cả ở cuối? Thậm chí có thể không?Làm cách nào để xác thực xml dựa trên xsd và nhận các lỗi * ALL *?

public static void validate(File xml, InputStream xsd) { 
    try { 
     SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     Schema schema = factory.newSchema(new StreamSource(xsd)); 
     Validator validator = schema.newValidator(); 
     StreamSource xmlFile = new StreamSource(xml); 
     validator.validate(xmlFile); 

    } catch (SAXException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Ví dụ này có thể hữu ích: http://java-by-ash.blogspot.com/2012/07/xml-schema-validation.html – ThreaT

Trả lời

50

giữa Validator validator = schema.newValidator();StreamSource xmlFile = new StreamSource(xml); thêm đoạn này:

final List<SAXParseException> exceptions = new LinkedList<SAXParseException>(); 
    validator.setErrorHandler(new ErrorHandler() 
    { 
    @Override 
    public void warning(SAXParseException exception) throws SAXException 
    { 
     exceptions.add(exception); 
    } 

    @Override 
    public void fatalError(SAXParseException exception) throws SAXException 
    { 
     exceptions.add(exception); 
    } 

    @Override 
    public void error(SAXParseException exception) throws SAXException 
    { 
     exceptions.add(exception); 
    } 
    }); 

Bằng cách này, sau khi validate() bạn sẽ nhận được danh sách đầy đủ các trường hợp ngoại lệ, nhưng nếu một lỗi nghiêm trọng xảy ra, phân tích cú pháp dừng lại ...

EDIT: JavaDoc cho biết: Ứng dụng phải giả định rằng tài liệu không sử dụng được sau khi trình phân tích cú pháp đã gọi phương thức này và sẽ tiếp tục (nếu có) chỉ vì mục đích thu thập thêm e thông báo lỗi: trên thực tế, Trình phân tích cú pháp SAX được tự do dừng báo cáo bất kỳ sự kiện nào khác khi phương thức này đã được gọi. Vì vậy, fatalError() có thể hoặc không thể làm cho việc phân tích cú pháp dừng lại.

Các vấn đề liên quan