Comment valider XML contre xsd 1.1 en Java?

Quelle est la meilleure façon de valider les fichiers XML par rapport au schéma XML 1.1 en Java?

j'ai pris le code de cette tutoriel et changé la ligne où il regarde vers le haut de l'usine pour utiliser le schéma XML 1.1 comme je l'ai vu dans cet exemple de code de Xerces FAQ.

voici mon 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());
        }
    }
}

le code lance cette exception:

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

selon moi, j'ai exactement les mêmes importations que l'extrait de code dans le Xerces FAQ. J'ai même essayé d'ajouter Xerces à mes dépendances Maven, mais cela n'a pas aidé non plus.

Cheers :)

15
demandé sur Petru Gardea 2013-12-28 00:01:47

3 réponses

Je ne pense pas que vous puissiez utiliser le mécanisme de service JAXP pour rechercher un processeur xsd 1.1. Chargez Saxon ou Xerces normalement, puis activez le traitement xsd 1.1. Pour Saxonne ceci est fait en utilisant

SchemaFactory.setProperty("http://saxon.sf.net/feature/xsd-version", "1.1")
7
répondu Michael Kay 2013-12-28 09:48:13

malheureusement, ni la version empaquetée de JDK (à partir de Java 8) ni la dernière version officielle de maven central (2.11.0) ne contient l'implémentation de xsd 1.1.

Vous avez réellement besoin de l' 2.11.0-xml-schema-1.1-beta version de Xerces pour pouvoir exécuter l'exemple dans la FAQ que vous avez liée.

vous pouvez faire l'une des choses suivantes.

  1. Télécharger Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta) binaires à partir du site Web de Xerces et ajouter manuellement des pots à classpath (ou installer localement via Maven). Lien: http://xerces.apache.org/mirrors.cgi. Vous avez besoin d'au moins les éléments suivants:

    cupv10k-runtime.jar
    org.eclipse.wst.xml.xpath2.processor_1.1.0.jar
    xercesImpl.jar
    xml-apis.jar
    
  2. utilisez la dépendance Maven non officielle suivante.

    <dependency>
        <groupId>org.opengis.cite.xerces</groupId>
        <artifactId>xercesImpl-xsd11</artifactId>
        <version>2.12-beta-r1667115</version>
    </dependency>
    
14
répondu Mustafa 2015-08-08 02:55:25

il existe un validateur XML générique qui fonctionne avec XML Schema v1.1, qui utilise xercesImpl-xsd112.12-beta-r1667115. Le validateur est disponible ici comme un plugin Maven et ici comme une intégrable bibliothèque.

0
répondu Seva Safris 2018-04-25 13:43:09