java xml validation xsd xsd-1.1

¿Cómo validar XML contra XSD 1.1 en Java?



validation xsd-1.1 (2)

Desafortunadamente, ni la versión incluida de JDK (a partir de Java 8) ni la última versión oficial de maven central (2.11.0) contienen la implementación de XSD 1.1.

Realmente necesita la 2.11.0-xml-schema-1.1-beta de Xerces para poder ejecutar el ejemplo en las preguntas frecuentes que ha vinculado.

Puede hacer uno de los siguientes.

  1. Descargue los Xerces2 Java 2.11.0 (XML Schema 1.1) (Beta) del sitio web de Xerces y agregue manualmente jar a la ruta de clases (o instálelos localmente a través de Maven). Enlace: http://xerces.apache.org/mirrors.cgi . Necesitas al menos lo siguiente:

    cupv10k-runtime.jar org.eclipse.wst.xml.xpath2.processor_1.1.0.jar xercesImpl.jar xml-apis.jar

  2. Use la siguiente dependencia maven no oficial.

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

¿Cuál es la mejor forma de validar archivos XML contra XML Schema 1.1 en Java?

Tomé el código de este tutorial y cambié la línea donde se ve desde la fábrica para usar XML Schema 1.1 como he visto en este ejemplo de código de las preguntas frecuentes de Xerces .

Este es mi código:

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

El código arroja esta excepción:

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

Según lo veo, tengo exactamente las mismas importaciones que el fragmento de código en las preguntas frecuentes de Xerces. Incluso traté de agregar Xerces a mis dependencias Maven, pero eso tampoco ayudó.

Saludos :)


No creo que pueda usar el mecanismo de servicio JAXP para buscar un procesador XSD 1.1. Cargue Saxon o Xerces de la manera normal y luego habilite el procesamiento de XSD 1.1. Para Saxon esto se hace usando

SchemaFactory.setProperty("http://saxon.sf.net/feature/xsd-version", "1.1")