Hi all,

The MSV example code on http://www.dom4j.org/cookbook/cookbook.html
has several typos and errors that prevent it compiling, and is
incomplete so nothing actually happens if you run it.

In the attached version I've fixed those issues, and it now compiles
and runs fine against MSV 20010719, on two test documents (one valid,
one invalid).

Can you update the cookbook?

Thanks,

-- Martijn
// based on http://www.dom4j.org/cookbook/cookbook.html

import com.sun.msv.grammar.Grammar;
import com.sun.msv.reader.util.GrammarLoader;
import com.sun.msv.reader.util.IgnoreController;
import com.sun.msv.verifier.DocumentDeclaration;
import com.sun.msv.verifier.ValidityViolation;
import com.sun.msv.verifier.Verifier;
import com.sun.msv.verifier.VerificationErrorHandler;

import javax.xml.parsers.SAXParserFactory;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.dom4j.io.SAXWriter;

import org.xml.sax.ContentHandler;
import org.xml.sax.ErrorHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXParseException;

import java.net.URL;
import java.io.File;

public class Schema {

    public static void main(String argv[]) {
        try {
            String filename = argv[0];
            String schema = argv[1];

            URL fileURL = new File(filename).toURL();
            URL schemaURL = new File(schema).toURL();

            SAXReader reader = new SAXReader();
            Document doc = reader.read(fileURL);
            validate(doc, schemaURL.toExternalForm());
        } catch (Exception e) {
            e.printStackTrace(System.err);
        }
    }

    static public void validate(Document doc, String schema)
        throws Exception {

        // Turn on Namespace handling in theJAXP SAXParserFactory
        SAXParserFactory saxFactory = SAXParserFactory.newInstance();
        saxFactory.setNamespaceAware(true);

        // create MSVs DocumentDeclaration by overriding
        // a IgnoreController in an anonyous inner class
        DocumentDeclaration docDeclaration = 
            GrammarLoader.loadVGM(schema, new IgnoreController() {

                    public void error(Locator[] locations, 
                                      String message, 
                                      Exception exception) {
                        System.out.println("ERROR: " + message);
            }

            public void error(Locator[] locations, String message) {
                System.out.println("WARNING: " + message);
            }
        }, saxFactory);

        // create a new Verifier that reports vlidation errors
        // using an anonymous inner class 
        Verifier verifier = 
            new Verifier(docDeclaration, new VerificationErrorHandler() {

                    public void onError(ValidityViolation e) {
                        System.out.println("Document invalid! Error: " + e);
                    }

                    public void onWarning(ValidityViolation e) {
                        System.out.println("Document invalid! Warning: " + e);
                    }
                });

        SAXWriter writer = new SAXWriter((ContentHandler) verifier);
        writer.setErrorHandler(new ErrorHandler() {

                public void error(SAXParseException e) {
                    System.out.println("ERROR:" + e);
                }

                public void fatalError(SAXParseException e) {
                    System.out.println("Fatal:" + e);
                }

                public void warning(SAXParseException e) {
                    System.out.println("Warning:" + e);
                }
        });

        // validate now!
        writer.write(doc);
        if (verifier.isValid())
            System.err.println("The document was valid");
        else
            System.err.println("The document was not valid");
    }
}

Reply via email to