XML validation against XSD 1.1 with Xerces in Java

10,218

Solution 1

It looks that you need Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta) version, which isn't in maven repository. You can download it from Xerces website, and install it to your local maven repository: mvn install:install-file -Dfile=xercesImpl.jar -DgroupId=xerces -DartifactId=xercesImpl -Dversion=2.11.0.beta -Dpackaging=jar Then you will be able to include it in your Maven project dependencies:

<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.11.0.beta</version>
</dependency>   

Solution 2

I will add another answer, because for me this dependency did not work (same error as described by OP):

<dependency>
  <groupId>xerces</groupId>
  <artifactId>xercesImpl</artifactId>
  <version>2.11.0</version>
</dependency>

I quess 2.11.0 should be newer than 2.11.0.beta, but it seems like xsd1.1 is not supported in that version !

Instead only the following dependency lead to a working XSD1.1 validation for me:

<dependency>
    <groupId>org.opengis.cite.xerces</groupId>
    <artifactId>xercesImpl-xsd11</artifactId>
    <version>2.12-beta-r1667115</version>
</dependency>

( Found in this SO thread: How to validate XML against XSD 1.1 in Java? )

Solution 3

I think they have added version 2.11 to maven now. The following dependency in Maven works out-of-the-box:

<dependency>
  <groupId>xerces</groupId>
  <artifactId>xercesImpl</artifactId>
  <version>2.11.0</version>
</dependency>
Share:
10,218
Vogon Jeltz
Author by

Vogon Jeltz

Updated on July 17, 2022

Comments

  • Vogon Jeltz
    Vogon Jeltz almost 2 years

    I have installed Xerces through Maven:

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jdom</groupId>
            <artifactId>jdom</artifactId>
            <version>2.0.2</version>
        </dependency>
        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
            <version>2.11.0</version>
        </dependency>            
    </dependencies>
    

    I then tried the code given in this example from the Xerces FAQ to validate a XML file against a schema in version 1.1. This is my code:

    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");
    
        // 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 only yields 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
    at javax.xml.validation.SchemaFactory.newInstance(SchemaFactory.java:204)
    at example.xml.XSDValidator.validateFile(XSDValidator.java:65)
    

    Seems like I failed to configure/install Xerces correctly. Please help me get this working, the XML files force me to use the schema in 1.1, I got a normal validator for 1.0 running but I have huge problems with this. I appreciate every hint!

  • Vogon Jeltz
    Vogon Jeltz over 10 years
    Thanks for the quick reply! I downloaded the Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta) - zip binary distribution and then tried to install it. When I use your mvn command the only answer I get is what you get when you type "mvn -version". There is no error or confirmation message. And adding the dependency leads to an error, so I suspect the install failed. Do I have to put the xercesImpl.jar to a specific folder before I can run that command? I also tried giving it the full path to the file.
  • MGorgon
    MGorgon over 10 years
    Sorry! It's my fault. -version=2.11.0.beta should be -Dversion=2.11.0.beta. So full command is now: mvn install:install-file -Dfile=xercesImpl.jar -DgroupId=xerces -DartifactId=xercesImpl -Dversion=2.11.0.beta -Dpackaging=jar I checked it for you and after installing it to local repository, and injecting into pom.xml with version 2.11.0.beta, no exception is thrown from schema factory. Try it out, good luck
  • Vogon Jeltz
    Vogon Jeltz over 10 years
    Oh boy, I could have seen that! :D Thank you so much, I got it working now. I had to add the org.eclipse.wst.xml.xpath2.processor_1.1.0.jar also because otherwise I got a classNotFound exception. That jar is found in the same folder as the xercesImpl.jar. Thanks again!
  • Alex
    Alex about 8 years
    "Out of the box" is different. Maybe you know whats wrong for me: stackoverflow.com/questions/35941613/…
  • Vogon Jeltz
    Vogon Jeltz almost 8 years
    Thank you, that works for me as well. Do you have any information who develops this version 2.12 or if it is official? I could not find any information about 2.12 on the official Apache Xerces website.
  • Alex
    Alex almost 8 years
    Me neither, I just struggled over the linked Stack Overflow thread, from where I got the working dependency. Maybe the author of the post knows more.