Aquesta setmana, vaig rebre una tasca interessant: polvoritzar una aplicació Java llegida. L'aplicació analitza arxius XML específics en format propietari. Sé que XML no sona sexy per als desenvolupadors menors, però té un avantatge sorprenent. Es pot validar un arxiu contra una gramàtica. Aquesta gramàtica s'anomena XSD, l'acrònim de XML Schema Definition. Facte divertit: escriu XSDs en XML. En aquest post, explico el problema, el que vaig provar i la solució final de treball. El problema El bo és que l'aplicació ja utilitza XSD. No obstant això, en el moment de la creació de l'aplicació, la validació XSD estava en . el S'han afegit diverses característiques importants. en particular, v1.1 afegeix i . Versió 1.0 Versió 1.1 Afirmacions Restriccions identitàries Hi havia nombrosos comentaris de '//TODO validar' en el codi Java que no es podien implementar en XSD 1.0 però podien en XSD 1.1. Un enfocament ingenu Sota el capó, el JDK utilitza una implementació Xerces embolicada per a l'anàlisi. Per divertir-se, comproveu el paquet 'com.sun.org.apache.xerces.internal.jaxp' en els vostres JDKs instal·lats. Aquesta implementació està enganxada a la validació XSD 1.1. Vaig assumir que el Vaig afegir l'última versió a la meva construcció, i... res. vaig cavar més profundament en el JAR i vaig trobar el següent: Xerxes regulars public final class Constants { /** XML 1.1 feature ("xml-1.1"). */ public static final String XML_11_FEATURE = "xml-1.1"; // Constant to enable Schema 1.1 support public final static boolean SCHEMA_1_1_SUPPORT = false; public final static short SCHEMA_VERSION_1_0 = 1; public final static short SCHEMA_VERSION_1_0_EXTENDED = 2; } - El Constants.cat Constants.cat Si estàs confós perquè el suport de l'esquema 1.1 és constant, benvingut al meu món. El projecte presenta dues branques potencialment interessants, i El La classe a l'antiga branca es veu com: Xerxes-J xml-schema-1.1-dev xml-schema-1.1-tests Constants public final class Constants { /** XML 1.1 feature ("xml-1.1"). */ public static final String XML_11_FEATURE = "xml-1.1"; // Constant to enable Schema 1.1 support public final static boolean SCHEMA_1_1_SUPPORT = false; public final static short SCHEMA_VERSION_1_0 = 1; public final static short SCHEMA_VERSION_1_0_EXTENDED = 2; public final static short SCHEMA_VERSION_1_1 = 4; } 1 Encara no recolzat 2 Però sembla prometedor? - Constants.java Constants.cat Vaig buscar un artefacte com aquest. : no mostra cap artefacte dedicat. Maven Central No em va venir a la ment en aquell moment, però mentre escrivia el post, vaig comprovar: el La pàgina ofereix una distribució XSD 1.1. Això significaria obtenir el JAR, crear un POM estúpid i publicar-los a l'Artifactory intern, al qual no tinc accés per escriure. Xerxes Descàrregues Buscant alternatives Vaig buscar alternatives, però l'única que vaig trobar va ser Saxon. El paquet Saxon és una col·lecció d'eines per al processament de documents XML. Els principals components són: An XSLT processor, which can be used from the command line, or invoked from an application, using a supplied API. Saxon implements the XSLT 3.0 Recommendation. The product can also be used to run XSLT 2.0 stylesheets, or XSLT 1.0 stylesheets in backwards compatibility mode. An XPath processor accessible to applications via a supplied API. This supports XPath 2.0 and XPath 3.1. It can also be used in backwards-compatibility mode to evaluate XPath 1.0 expressions. An XQuery processor that can be used from the command line, or invoked from an application by use of a supplied API. This supports XQuery 3.1, which also allows XQuery 1.0 or 3.0 queries to be executed. With Saxon-EE, you can also use the XQuery extensions defined in the XQuery Update 1.0 Recommendation, but later working drafts of XQuery Update are not supported (W3C has abandoned work on these versions). An XML Schema Processor. . This can be used on its own to validate a schema for correctness, or to validate a source document against the definitions in a schema. It is also used to support the schema-aware functionality of the XSLT and XQuery processors. Like the other tools, it can be run from the command line, or invoked from an application. This supports both XSD 1.0 and XSD 1.1 El paquet Saxon és una col·lecció d'eines per al processament de documents XML. Els principals components són: Un processador XSLT, que pot ser utilitzat des de la línia de comandes, o invocat des d'una aplicació, utilitzant una API subministrada. Saxon implementa la Recomanació XSLT 3.0. El producte també es pot utilitzar per executar fulls d'estil XSLT 2.0, o fulls d'estil XSLT 1.0 en mode de compatibilitat retroactiva. Un processador XPath accessible a les aplicacions a través d'una API subministrada. Això és compatible amb XPath 2.0 i XPath 3.1. Un processador XQuery que pot ser utilitzat des de la línia de comandes, o invocat des d'una aplicació utilitzant una API subministrada. Això dóna suport a XQuery 3.1, que també permet executar consultes XQuery 1.0 o 3.0. Amb Saxon-EE, també es poden utilitzar les extensions XQuery definides en la Recomanació XQuery Update 1.0, però no es donen suport a projectes de treball posteriors de XQuery Update (el W3C ha abandonat el treball en aquestes versions). Un processador d'esquemes XML. Això és compatible amb XSD 1.0 i XSD 1.1. Això es pot utilitzar per si sol per validar un esquema per la correcció, o per validar un document font contra les definicions d'un esquema. També s'utilitza per donar suport a la funcionalitat conscient de l'esquema dels processadors XSLT i XQuery. Com les altres eines, es pot executar des de la línia de comandes, o invocar des d'una aplicació. Què és Saxon? Què és Saxon? Després d'investigar una mica, vaig trobar que Sax tenia dos inconvenients principals: Tot i que és possible utilitzar l'API JAXP normal, haureu de canviar a l'API propietària de Saxon per desbloquejar-ne tota la potència. Saxon ve en dos sabors: l'Enterprise Edition és de pagament, i l'Home Edition és gratuït. No tenia cap pressupost ni temps per caçar-lo. Tornar a la plaça 1 Ha arribat el moment de reavaluar la situació. Construir des de la font? No és factible. Saxon? Pagar. La meva última esperança va ser AI. He de dir que per una vegada, va ser un salvador de vides. Es revela que hi ha dues construccions de Xerces amb característiques XSD 1.1 Van ser publicats per OpenGIS el 2015-2016, en un moment en què era bastant fàcil publicar-hi. Esmenta de quina branca prové: . Maven Central El seu POM http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/ En aquest punt, vaig estar un parell de línies de codi lluny de l'objectiu: var schemaFactory = SchemaFactory.newInstance(Constants.W3C_XML_SCHEMA11_NS_URI); var schema = schemaFactory.newSchema(schemaFile); var saxParserFactory = SAXParserFactory.newInstance(); saxParserFactory.setNamespaceAware(true); saxParserFactory.setSchema(schema); var reader = saxParserFactory.newSAXParser().getXMLReader(); reader.setContentHandler(handler); reader.setErrorHandler(handler); reader.setEntityResolver(handler); Configuració de la versió XSD 1.1 Establir l'esquema a la fàbrica Pars regular de SAX Encara cal validar correctament que no hi ha cap problema de seguretat d'aquesta construcció "salvatge", però funciona: puc aprofitar les característiques de XSD 1.1! Conclusió En aquest post, vaig descriure el meu viatge implementant la validació XSD 1.1 en Java. És molt menys fàcil del que m'esperava en un primer moment, però espero que ajudarà a altres que es trobin en la mateixa situació. Per anar més enllà: Java API per al processament XML (JAXP) El projecte Apache XercesTM Originalment publicat a A Java Geek Una java geek