javaxmlvalidationxsd

How to validate an XML file against an XSD file?


I'm generating some xml files that needs to conform to an xsd file that was given to me. How should I verify they conform?


Solution

  • The Java runtime library supports validation. Last time I checked this was the Apache Xerces parser under the covers. You should probably use a javax.xml.validation.Validator.

    import javax.xml.XMLConstants;
    import javax.xml.transform.Source;
    import javax.xml.transform.stream.StreamSource;
    import javax.xml.validation.*;
    import java.net.URL;
    import org.xml.sax.SAXException;
    //import java.io.File; // if you use File
    import java.io.IOException;
    ...
    URL schemaFile = new URL("http://host:port/filename.xsd");
    // webapp example xsd: 
    // URL schemaFile = new URL("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd");
    // local file example:
    // File schemaFile = new File("/location/to/localfile.xsd"); // etc.
    Source xmlFile = new StreamSource(new File("web.xml"));
    SchemaFactory schemaFactory = SchemaFactory
        .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    try {
      Schema schema = schemaFactory.newSchema(schemaFile);
      Validator validator = schema.newValidator();
      validator.validate(xmlFile);
      System.out.println(xmlFile.getSystemId() + " is valid");
    } catch (SAXException e) {
      System.out.println(xmlFile.getSystemId() + " is NOT valid reason:" + e);
    } catch (IOException e) {}
    

    The schema factory constant is the string http://www.w3.org/2001/XMLSchema which defines XSDs. The above code validates a WAR deployment descriptor against the URL http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd but you could just as easily validate against a local file.

    You should not use the DOMParser to validate a document (unless your goal is to create a document object model anyway). This will start creating DOM objects as it parses the document - wasteful if you aren't going to use them.