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!!!
JavaMail es una expansión de Java que facilita el envío y recepción de e-mail desde código java. JavaMail implementa el[...]
En este tutorial veremos la forma de conectarse a una base de datos de Firebird utilizando el lenguaje Java y el IDE Net[...]
En este post crearemos un componente que solo hay en android y que no esta disponible en la paleta de controles de Netbe[...]
El Ascii Art o Arte Ascii, consiste en realizar dibujos con los caracteres ASCII (Código Americano Estándar de Intercamb[...]
Ya tengo varios post sobre conexión a base de datos en varios lenguajes y claro no podía faltar c#, el siguiente tutoria[...]
Crear una librería swing para java utilizando Netbeans no es nada del otro mundo y la cantidad de código que vayamos a e[...]