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"); } }