Un esquema XSD se utiliza para describir y validar la estructura y contenido de los datos de un documento XML. Un esquema XSD define los elementos, atributos y tipos de datos similar a un esquema de base de datos que describe los datos en ella.
El esquema XSD se trata de una forma alternativa a los esquema DTD (Definición de Tipo de Documento). La diferencia entre ambos esquemas esta en que XSD utiliza una sintaxis basada en XML y las DTD una sintaxis derivada de SGML, XSD permite especificar los tipos de datos, es extensible (permite crear nuevos elementos), etc. Estas entre otras características llevaron a preferir XSD sobre DTD.
En este post validaremos un documento XML usando el esquema XSD y el lenguaje java. Previamente conoceremos como crear archivos XML y XSD desde nuestro IDE de trabajo.
Necesitamos:
Paso 1. El proyecto
Crea un nuevo proyecto en Netbeans con la siguiente estructura:
Validacion XSD +--- Paquete de fuentes +--- example +--- Main.java
Paso 2: Archvos XSD
Para crear un archivo XSD, clic derecho sobre el paquete «example» -> new -> Other -> en categoría buscas XML y en tipo de archivo seleccionas XML Schema (empty), a continuación le pones el nombre de MiEsquema y presionas el botón [terminar].
Nuestro esquema XSD nos permitirá la validación de un pequeño formulario compuestos por tres campos, el nombre del usuario de tipo String y con una longitud máxima de 32 caracteres y una mínima de 6. Así mismo se desea controlar la edad, solo para mayores de 18 años y hasta un máximo de 99 años, este campo es de tipo entero. Finalmente se requiere la validación del correo electronico para lo cual se hace uso de expresiones regulares.
<?xml version="1.0"?> <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="formulario"> <xs:complexType> <xs:sequence> <!-- Nombre de usuario --> <xs:element name="nombre" > <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="6" /> <xs:maxLength value="32" /> </xs:restriction> </xs:simpleType> </xs:element> <!-- Edad, solo mayores de 18 años --> <xs:element name="edad"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="18" /> <xs:maxInclusive value="99" /> </xs:restriction> </xs:simpleType> </xs:element> <!-- Correo electonico --> <xs:element name="mail"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[^@]+@[^\.]+\..+"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Paso 3. Documento XML
Para crear un archivo XML, clic derecho sobre el paquete example -> New -> Other -> en categoría seleccionar XML -y en tipo de archivo documento XML, en nombre de archivo escribir «MiFormulario» a continuación seleccionar la opción «Documento con restricciones de esquema XML» y presionar [siguiente]
En la siguiente ventana, busca y selecciona el archivo MiEsquema.xsd creado en el paso 2
Presiona [siguiente] deja las opciones de la ventana como esta y finalmente presiona [terminar]
Se crea un archivo XML vacío con las etiquetas declaradas en el esquema XSD
Paso 4. Código validación desde java
Abre el archivo Main.java y pega el siguiente código:
import java.io.IOException; import javax.xml.XMLConstants; 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.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; /** * @see https://www.jc-mouse.net/ * @author mouse */ public class Main { public static void main(String[] args) { try { //URI del espacio de nombres del esquema XML del W3C. http://www.w3.org/2001/XMLSchema SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); //Representa un conjunto de restricciones que se pueden verificar / aplicar en un documento XML //Un objeto de esquema generalmente se crea a partir de SchemaFactory Schema schema = factory.newSchema(Main.class.getResource("/example/MiEsquema.xsd")); //verifica un documento XML contra el esquema XSD Validator validator = schema.newValidator(); //Establece el ErrorHandler para recibir los errores encontrados durante la //invocación del método de validación. validator.setErrorHandler(new ErrorHandler() { @Override public void warning(SAXParseException exception) throws SAXException { mostrarError(exception); } @Override public void error(SAXParseException exception) throws SAXException { mostrarError(exception); } @Override public void fatalError(SAXParseException exception) throws SAXException { mostrarError(exception); } private void mostrarError(SAXParseException exception) { System.out.println("Linea: " + String.format("%4s|", exception.getLineNumber()) + exception.getMessage()); } }); //Valida la entrada especificada. Debe ser un documento XML o un elemento XML y no debe ser nulo validator.validate(new StreamSource(Main.class.getResourceAsStream("/example/MiFormulario.xml"))); } catch (SAXException | IOException ex) { System.err.println(ex.getMessage()); } } }
No se utiliza ninguna librería adicional solo la API javax.xml.* la cual es una colección de APIs para el parseo y tratamiento de documentos XML parte del JDK. Así mismo también se usa el API org.xml.sax para el control de de eventos de error.
Paso 5: Validación
Agrega los siguientes datos al archivo MiFormulario.xml y ejecuta el archivo Main.java
<?xml version="1.0" encoding="UTF-8"?> <formulario xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='MiEsquema.xsd'> <nombre>Aquiles Brinco</nombre> <edad>21</edad> <mail>admin@mail.com</mail> </formulario>
Estos datos cumplen con los requisitos del esquema XSD por lo que no obtendrás ninguna excepcion y el programa termina sin errores.
Ahora reemplaza los datos del archivo XML por los siguientes datos:
<?xml version="1.0" encoding="UTF-8"?> <formulario xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='MiEsquema.xsd'> <nombre>Juan</nombre> <edad>15</edad> <mail>admin.mail.com</mail> </formulario>
Estos datos no cumplen con el esquema XSD por lo que obtendremos por pantalla los siguientes errores:
enjoy!!!
El siguiente código te permite abrir enlaces web desde un JLabel, ademas aprovechando el soporte a etiquetas HTML del co[...]
Google tiene entre su formulario de autenticación de usuario para sus diferentes servicios (gmail, blogger, youtube, g+)[...]
El proyecto «Java Decompiler» tiene como objetivo desarrollar herramientas para descompilar y analizar byte code de jav[...]
En este oportunidad comparto una pequeña aplicación hecha en java para recortar partes de una imagen seleccionado con el[...]
En este post aprenderemos los pasos básicos para construir una aplicación android con soporte multilenguaje, utilizaremo[...]
La página oficial de Retrofit, se describe así misma como «Un cliente REST seguro para Android y Java». Y es así, ya qu[...]