How to validate XML against XSD 1.1 in Java?

Viewed 17020

What is the best way to validate XML files against XML Schema 1.1 in Java?

I took the code from this tutorial and changed the line where it looks up the factory to use XML Schema 1.1 as I have seen in this code example from the Xerces FAQ.

This is my code:

import java.io.File;
import java.io.IOException;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;

public class XSDValidator {
    private static void validateFile(File xmlFile, File xsdFile) throws SAXException, IOException
    {
        // 1. Lookup a factory for the W3C XML Schema language
        SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/XML/XMLSchema/v1.1");
        // SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

        // 2. Compile the schema.
        File schemaLocation = xsdFile;
        Schema schema = factory.newSchema(schemaLocation);

        // 3. Get a validator from the schema.
        Validator validator = schema.newValidator();

        // 4. Parse the document you want to check.
        Source source = new StreamSource(xmlFile);

        // 5. Check the document
        try
        {
            validator.validate(source);
            System.out.println(xmlFile.getName() + " is valid.");
        }
        catch (SAXException ex)
        {
            System.out.println(xmlFile.getName() + " is not valid because ");
            System.out.println(ex.getMessage());
        }
    }
}

The code throws this exception:

java.lang.IllegalArgumentException: No SchemaFactory that implements the schema language specified by: http://www.w3.org/XML/XMLSchema/v1.1 could be loaded

As I see it I have exactly the same imports as the code snippet in the Xerces FAQ. I even tried to add Xerces to my Maven dependencies but that didn't help either.

Cheers :)

5 Answers

After searching for a while, this tutorial contains these dependency worked for me:

<dependency>
    <groupId>org.exist-db.thirdparty.xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.12.0</version>
    <classifier>xml-schema-1.1</classifier>
</dependency>

<!-- xpath2 and java-cup are needed at runtime
        for xercesImpl Schema 1.1 support -->
<dependency>
    <groupId>org.exist-db.thirdparty.org.eclipse.wst.xml</groupId>
    <artifactId>xpath2</artifactId>
    <version>1.2.0</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>edu.princeton.cup</groupId>
    <artifactId>java-cup</artifactId>
    <version>10k</version>
    <scope>runtime</scope>
</dependency>

Unfortunately, these libraries don't seem to be official. So, use it at your own risk.

Xerces-J provides a "fully compliant XML Schema 1.1 implementation" since version 2.12.0, current version is 2.12.2, see release history here: https://xerces.apache.org/news.html.

Related