XML Schema elementos simples y tipos de datos
XML Schema, elementos simples
Los ficheros XSD pueden estar formados por elementos simples o complejos. Los elementos simples son aquellos que solamente pueden contener un valor concreto (un texto, un número) y nada más. Si necesitamos un elemento que a su vez contenga otros elementos o atributos eso sería un elemento complejo.
Para definir un elemento simple basta con poner algo así:
<xs:element name="nombrecliente" type="xs:string" />
Está claro que ese elemento contendrá un texto.
Los tipos
Los tipos se pueden aplicar tanto a elementos como a atributos. Los atributos personalizados
se aplican a elementos complejos. Pero ahora lo que nos ocupa es ver qué tipos tenemos.
Los tipos de los que disponemos son los habituales: string, integer, decimal, date, time, boolean,... cada uno
con sus peculiaridades y opciones.
El tipo boolean
Es de los más simples, puede contener cuatro posibles valores: true, false, 1, 0
El tipo string y sus derivados
Es un tipo bastante simple del que se pueden crear tipos simples con ciertas restricciones
como whitespace, length,minLength,maxLength,pattern,enumeration,assertions
Por ejemplo el DNI:
<xs:element name="dni">
<xs:simpleType>
<xs:restriction base='string'>
<xs:length value='9' fixed='true' />
</xs:restriction>
</xs:simpleType>
<xs:element>
O una enumeración:
<xs:element name="sistema">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Windows"/>
<xs:enumeration value="Linux"/>
<xs:enumeration value="OS2"/>
<xs:enumeration value="MSDOS"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Los patrones permiten expresiones regulares. El dni se puede hacer así también:
<xs:element name="dni" type="tipoDni" />
<xs:simpleType name="tipoDni">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{8}[A-Z]{1}"/>
</xs:restriction>
</xs:simpleType>
Con el whitespace podemos indicar cómo queremos que se traten los espacios en blanco.
Podemos indicar estos valores:
- preserve: mantiene los espacios blancos o caracteres no visibles.
- collapse: quita cualquier caracter no visible (espacios, saltos, etc..)
- replace: sustituye saltos de línea etc por espacios en blanco.
<xs:element name="nombreLimpio">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Las longitudes también dan juego:
<xs:element name="contrasena">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="8"/>
<xs:maxLength value="15"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Tipos numéricos
Aparte de los clásicos interger y decimal, disponemos de los siguientes:
- byte, unsignedByte
- decimal,
- int, unsignedInt,
- integer, negativeInteger (-1,-2,-3,..), nonPositiveInteger (0,-1,-2,...), nonNegativeInteger (0,1,2,...), positiveInteger (1,2,3,...)
- long,unsignedLong
- short,unsignedShort
Si cremos tipos propios como con los Strings podemos aplicar estas resitrcciones:
- enumeration: un conjunto de números
- fractionDigits: total de decimales a mostrar
- maxExclusive: valor máximo EXcluyendo el indicado
- maxInclusive: valor máximo incluyendo el indicado
- minExclusive: valor mínimo EXcluyendo el indicado
- minInclusive: valor mínimo incluyendo el indicado
- pattern: aplicar patrón regex
- totalDigits: total de dígitos a mostrar
- whiteSpace: tratamiendo de espacios en blanco
Las fechas.
Hay varios tipos.
Date
El date de toda la vida
<xs:element name="nacimiento" type="xs:date" />
Por ejemplo (es Año-Mes-Día)
<nacimiento>1983-02-28</nacimiento>
Podemos indicar la zona horaria en la fecha. Añadir una Z para zona UTC o bien
añadir diferencia de zona en positivo o negativo.
<nacimiento>1985-12-23-03:00</nacimiento>
<nacimiento>1985-12-23+03:00</nacimiento>
¡Ojo!! no es la hora, es la diferencia horaria.
Luego está el time para indicar una hora en formato hh:mm:ss
<xs:element name="inicio" type="xs:time" />
Por ejemplo:
<inicio>09:15:00</inicio>
También podemos indicar la zona horaria.
<inicio>09:15:00+01:00</inicio>
El dateTime
Une fecha y hora con formato: YYYY-MM-DDThh:mm:ss
Ojo con la T.
<xs:element name="instalacion" type="xs:dateTime" />
Por ejemplo:
<instalacion>2012-10-23T09:34:23</instalacion>
Y se puede añadir la zona horaria también.
<instalacion>2012-10-23T09:34:23-07:00</instalacion>
Duration, la duración en tiempo
Este tipo nos permite indicar la duración del tiempo.
El formato es el siguiente: PnYnMnDTnHnMnS
La P hay que ponerla sí o sí el resto:
- nY indica n años
- nM n meses
- nD n días
- T En el caso de que vayamos indicar un tiempo ponemos la T primero
- nH n horas
- nM n minutos
- nS n segundos
Por ejemplo
<xs:element name="condena" type="duration" />
y un valor:
<condena>P5Y2M1D</condena>
Sería una condena de cinco años dos meses y un día.
Luego tenemos los tipos más básicos
- type="xs:gDay" para representar un día en formato DD
- type="xs:gMonth" para representar un mes en formato MM
- type="xs:gMonthDay" para representar un mes-día en formato MM-DD
- type="xs:gYear" para representar un año en formato YYYY
- type="xs:gYearMonth" para representar un año-mes en formato YYYY-MM
Si cremos tipos propios como con los Strings y números podemos aplicar estas resitrcciones:
- enumeration
- maxExclusive
- maxInclusive
- minExclusive
- minInclusive
- pattern
- whiteSpace
Otros tipos raros
El binario:
puede ser en formato base64 o hexadecimal. Esto nos puede servir para meter un churro
en alguno de esos formatos dentro del document XML.
<xs:element name="binario" type="xs:hexBinary"/>
Luego
<binario>DEAD0663245345ABDDEAD2346562</binario>
Otro:
<xs:element name="adjunto" type="xs:base64Binary"/>
AnyURI
Es un tipo muy interesante para indicar una URL
<xs:element name="web" type="xs:anyURI" />
Luego
<web>http://pello.io</web>
---
Aplicable para todos
Aparte del tipo podemos especificar un valor por defecto:
<xs:element name="bote" type="xs:int" default="20" />
O incluso un valor fijo con el atributo fixed:
<xs:element name="pi" type="xs:decimal" fixed="3.1415" />