zoukankan      html  css  js  c++  java
  • JAXB

    Validation

    A considerable part of the XML Schema language deals with facets, enabling the programmer to restrict the basic datatypes. We have seen that the JAXB compiler doesn't care much about these facets as it just translates the basic datatype into one of Java's built-in types. A meticulous interpretation of these facets for checking that the XML data meets the constraints must be done during a schema validation.

    If you want to validate your document before it is unmarshalled, JAXB lets you request validation by passing an object of the class javax.xml.validation.Schema to the Unmarshaller object. First, you create this schema object by setting up a schema factory for the schema language of your choice. Then you create the Schema object by calling the factory's method newSchema:

    Schema mySchema;
    SchemaFactory sf = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
    try {
        mySchema = sf.newSchema( file );
    } catch( SAXException saxe ){
        // ...(error handling)
        mySchema = null;
    }

    After the Unmarshaller object has been established, you pass it the schema.

    JAXBContext jc = JAXBContext.newInstance( packagePath );
    Unmarshaller u = jc.createUnmarshaller();
    u.setSchema( mySchema );

    Basically that's all there is to it. If the XML data validation fails, an UnmarshalException (from javax.xml.bind) is thrown. Make sure to let the user of your program see the exception message so that the problem can be fixed. If you'd like to create your own error messages, you can pass a ValidationEventCollector to the unmarshaller which will store validation events into it so that you can retrieve an event and query its individual attributes. Insert these lines before you call the unmarshal method:

    ValidationEventCollector vec = new ValidationEventCollector();
    u.setEventHandler( vec );

    The best place for checking the event collector is in the finally phrase of the try statement wrapping all of this:

    if( vec != null && vec.hasEvents() ){
        for( ValidationEvent ve: vec.getEvents() ){
            String msg = ve.getMessage();
            ValidationEventLocator vel = ve.getLocator();
            int line = vel.getLineNumber();
            int column = vel.getColumnNumber();
            System.err.println( origin + ": " + line + "." + column + ": " + msg ); 
        }
    }

    Now this looks as if the validation process would be kind enough to present you with all the errors in your XML document, or at least as many as possible but, alas, it appears that the validation process throws an exception as soon as the first deviation is detected. If you want to continue as long as possible, you'll have to catch all errors with a ValidationEventHandler.

    Validation Event Handling

    The interface javax.xml.bind.ValidationEventHandler is quite simple. Implementing classes must provide a single method to catch a ValidationEvent as we've seen it in the previous section.

    boolean handleEvent( ValidationEvent event )

    To register, the Unmarshaller method setEventHandler is called. If the calling object is implementing the event handler interface, we might write:

    Unmarshaller u = jc.createUnmarshaller();
    u.setEventHandler( this );
  • 相关阅读:
    LeetCode 515. 在每个树行中找最大值(Find Largest Value in Each Tree Row)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 1022. 从根到叶的二进制数之和(Sum of Root To Leaf Binary Numbers)
    LeetCode 897. 递增顺序查找树(Increasing Order Search Tree)
    LeetCode 617. 合并二叉树(Merge Two Binary Trees)
    LeetCode 206. 反转链表(Reverse Linked List) 16
    LeetCode 104. 二叉树的最大深度(Maximum Depth of Binary Tree)
    LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15
    LeetCode 108. 将有序数组转换为二叉搜索树(Convert Sorted Array to Binary Search Tree) 14
  • 原文地址:https://www.cnblogs.com/huey/p/5506615.html
Copyright © 2011-2022 走看看