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" />