import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import org.w3c.dom.*; import java.io.*; class XmlValidHandlerManager extends DefaultHandler { private boolean bool_isValid = true; public void reportState() { if (isValid()) { System.out.println("Document valide"); } else { System.out.println("Document non valide"); } } public boolean isValid() { return bool_isValid; } private void reportProblem(String generalMessage, SAXParseException e) { System.err.println(generalMessage); System.err.println(" Ligne : "+e.getLineNumber()); System.err.println(" Colonne : "+e.getColumnNumber()); System.err.println(" Message : "+e.getMessage()); } public void fatalError(SAXParseException e) { reportProblem("Erreur de validation - Erreur fatal",e); bool_isValid = false; } public void error(SAXParseException e) { reportProblem("Erreur de validation - Erreur",e); bool_isValid = false; } public void warning(SAXParseException e) { reportProblem("Erreur de validation - Warning",e); bool_isValid = false; } } public class Validator { static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource"; // valider un document xml avec un schema sans prise en compte des espaces de noms public static Document domParseWithXsd(String xmlFileName, String xsdFileName) { return domParseWithXsd(xmlFileName, xsdFileName, false); } public static Document domParseWithXsd(String xmlFileName, String xsdFileName, boolean isNameSpaceAware) { try { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder db; Document dom; XmlValidHandlerManager errorHandler = new XmlValidHandlerManager(); // Reglages de la fabrique dbFactory.setIgnoringComments(true); dbFactory.setNamespaceAware(isNameSpaceAware); dbFactory.setValidating(true); dbFactory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); dbFactory.setAttribute(JAXP_SCHEMA_SOURCE, new File(xsdFileName)); db = dbFactory.newDocumentBuilder(); db.setErrorHandler(errorHandler); dom = db.parse(new File(xmlFileName)); errorHandler.reportState(); return dom; } catch (ParserConfigurationException e) { System.err.println(e.getMessage()); return null; } catch (SAXException e) { System.err.println(e.getMessage()); return null; } catch (java.io.IOException e) { System.err.println(e.getMessage()); return null; } } public static void main(String[] args) { if (args.length > 1) { // args[0] : XML // args[1] : XSD domParseWithXsd(args[0], args[1],true); } } }