XSD es utilizado para describir la estructura y las restricciones de los contenidos de los documentos XML de una forma muy precisa, más allá de las normas sintácticas impuestas por el propio lenguaje XML.
Un documento XML que tenga una sintaxis correcta se dirá que está "bien formado", mientras que un documento validado contra un XSD sería tanto "bien formado" como "válido".
Gracias a XSD podemos definir una descripción del formato correcto que debe tener un XML y además, dicho formato está descrito también en formato XML. Posteriormente, usando el mismo XSD, podemos verificar si un mensaje XML determinado cumple con el formato definido y es válido.
Los XSD además soportan tipos de datos, una de sus grandes ventajas dado que nos facilita la descripción del contenido del documento, la definición de restricciones en los datos, las validaciones de si los datos son correctos y la conversión de datos entre diferentes tipos de datos.
<xs:element name="note"> define el elemento llamando "note"
<xs:complexType> el elemento "note" es de tipo complejo (no es un nodo con un sólo valor)
<xs:sequence> el tipo complejo es una secuencia de elementos
<xs:element name="to" type="xs:string"> define el elemento "to" de tipo cadena de caracteres (texto)
<xs:element name="from" type="xs:string"> define el elemento "from" de tipo texto
<xs:element name="heading" type="xs:string"> define el elemento "heading" de tipo texto
XSD en i2factory i2factory hace uso de los XSD en los comando de cada tipo de puerto que disponga un conector específico, de tal manera que se informa a la solución de integración que esquema de mensaje va a recibir (puerto de entrada) o que esquema de mensaje debe de emitir (puerto de salida). La información de cada XSD puede verse en la información adicional de cada comando una vez seleccionado, haciendo click en el icono
|
< xs:element name = "note" > < xs:complexType > < xs:sequence > < xs:element name = "to" type = "xs:string" /> < xs:element name = "from" type = "xs:string" /> < xs:element name = "heading" type = "xs:string" /> < xs:element name = "body" type = "xs:string" /> </ xs:sequence > </ xs:complexType > </ xs:element > |
Campos obligatorios y no obligatorios
Si en alguna definición de un elemento aparece el atributo minOccurs="0" significa que ese elemento es opcional y no es requerido por el validador del XSD, es decir, no debe ser incluido obligatoriamente (puede estar en el mensaje o no).
Si por el contrario, en alguna definición de un elemento aparece el atributo minOccurs="1" significa que ese elemento es obligatorio y es requerido por el validador del XSD y por tanto debe estar en el mensaje.
Ejemplo de XSD en i2factoryVamos a ver un ejemplo real de uso en i2factory de los XSD. En este ejemplo vamos a ver el esquema XSD del comando "Obtener todos los archivos y carpetas" del puerto de entrada del conector de Dropbox:
|
<? xml version = "1.0" encoding = "UTF-8" ?> < xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema" attributeFormDefault = "unqualified" elementFormDefault = "qualified" version = "1.0" > < xsd:element name = "FileDropboxBean" > < xsd:complexType > < xsd:sequence > < xsd:element name = "fileName" type = "xsd:string" /> < xsd:element name = "fileSize" type = "xsd:string" minOccurs = "0" /> < xsd:element name = "isDeleted" type = "xsd:boolean" minOccurs = "0" /> < xsd:element name = "isDir" type = "xsd:boolean" /> < xsd:element name = "modified" type = "xsd:string" minOccurs = "0" /> < xsd:element name = "path" type = "xsd:string" /> < xsd:element name = "parentFolder" type = "xsd:string" /> < xsd:element name = "revision" type = "xsd:string" minOccurs = "0" /> < xsd:element name = "extension" type = "xsd:string" minOccurs = "0" /> < xsd:element name = "file" type = "xsd:base64Binary" minOccurs = "0" /> </ xsd:sequence > </ xsd:complexType > </ xsd:element > </ xsd:schema >
|
Y al pinchar sobre los slots de comunicaciones tanto en el área de modelado como en el depurador, podemos ver el esquema de modo gráfico. Si ejecutamos el
depurador podemos comprobar cómo los mensajes cumplen con los esquemas definidos:
Esquema del comando "Obtener todos los archivos y carpetas" del puerto de entrada de Dropbox: |
Esquema de un mensaje entrante del comando "Obtener todos los archivos y carpetas" del puerto de entrada de Dropbox: |
Esquema de otro mensaje entrante del comando "Obtener todos los archivos y carpetas":
|
En el caso del primer mensaje entrante, el puerto ha leído un directorio o carpeta (elemento isDir con valor true) por lo que campos como fileSize vale 0 y no están presentes
campos opcionales como modified o revision.
En el segundo caso, por el contrario, lo que el comando procesa es un fichero de imagen (elemento extension a jpg) por lo que contiene los campos opcionales modfied,
revision o incluso el propio elemento file que tiene como valor el contenido del fichero de imagen en formato binario de 64 bits.
Ambos mensajes cumplen con el esquema XSD definido previamente en el comando del conector de Dropbox, por lo que están bien formados y son válidos.