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 :)
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")
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.
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
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>
il existe un validateur XML générique qui fonctionne avec XML Schema v1.1, qui utilise xercesImpl-xsd11
2.12-beta-r1667115
. Le validateur est disponible ici comme un plugin Maven et ici comme une intégrable bibliothèque.