Un tipo de dato en XSD define qué clase de información puede contener un elemento o atributo de un documento XML.
Si no se define, por defecto todo se interpreta como texto (xs:string
). Con tipos de datos, podemos validar si un valor es un número, una fecha, un booleano, etc. Esto es lo que diferencia a XSD de un DTD, que solo trataba los valores como texto.
xs:string
: texto.xs:integer
: número entero (…, -2, -1, 0, 1, 2, …).xs:decimal
: número decimal (ej. 123.45).xs:boolean
: true
o false
.xs:date
: fecha en formato YYYY-MM-DD
.xs:time
: hora en formato HH:MM:SS
.xs:dateTime
: fecha y hora combinadas (YYYY-MM-DDTHH:MM:SS
).xs:anyURI
: una URL.xs:ID
: un identificador único dentro del documento XML.Ejemplo:
<xs:element name="edad" type="xs:integer"/>
<xs:element name="activo" type="xs:boolean"/>
<xs:element name="fechaNacimiento" type="xs:date"/>
<xs:element name="paginaWeb" type="xs:anyURI"/>
Se usan para agrupar otros elementos o atributos. (Este tema se profundiza más adelante; aquí nos enfocamos en restricciones sobre tipos simples).
Las facetas permiten restringir los valores posibles de un elemento o atributo.
<xs:element name="edad">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
minInclusive
: valor mínimo permitido (incluido).maxInclusive
: valor máximo permitido (incluido).Aquí edad
solo puede ser un número entre 0 y 120.
<xs:element name="nombre">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="3"/>
<xs:maxLength value="50"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
minLength
: número mínimo de caracteres.maxLength
: número máximo de caracteres.El nombre debe tener entre 3 y 50 caracteres.
<xs:element name="codigoPostal">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{5}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
El codigoPostal
debe ser exactamente 5 dígitos. Ejemplo válido: 50000
. Ejemplo inválido: AB123
.
<xs:element name="estadoCivil">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="soltero"/>
<xs:enumeration value="casado"/>
<xs:enumeration value="divorciado"/>
<xs:enumeration value="viudo"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
estadoCivil
solo puede tomar uno de esos 4 valores.
<xs:element name="precio">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:minExclusive value="0.0"/>
<xs:maxInclusive value="9999.99"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
minExclusive
: el valor debe ser mayor a 0.maxInclusive
: el valor máximo es 9999.99.fractionDigits
: máximo 2 decimales.Ejemplo válido: <precio>99.95</precio>
— Ejemplo inválido: <precio>-10.00</precio>
.
Archivo empleado.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="empleado">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="3"/>
<xs:maxLength value="50"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="edad">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="18"/>
<xs:maxInclusive value="65"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="estadoCivil">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="soltero"/>
<xs:enumeration value="casado"/>
<xs:enumeration value="divorciado"/>
<xs:enumeration value="viudo"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="salario">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:minExclusive value="0.0"/>
<xs:maxInclusive value="100000.00"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Archivo empleado.xml válido
<?xml version="1.0" encoding="UTF-8"?>
<empleado xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="empleado.xsd">
<nombre>Carlos Pérez</nombre>
<edad>35</edad>
<estadoCivil>casado</estadoCivil>
<salario>45000.50</salario>
</empleado>
Archivo empleado.xml inválido
<empleado>
<nombre>Al</nombre> <!-- Error: menos de 3 caracteres -->
<edad>70</edad> <!-- Error: fuera del rango 18-65 -->
<estadoCivil>union libre</estadoCivil> <!-- Error: no está en enumeración -->
<salario>123456.789</salario> <!-- Error: excede máximo permitido y decimales -->
</empleado>
string
, int
, boolean
, date
, etc.).minInclusive
, maxInclusive
(rangos); minLength
, maxLength
(longitud); pattern
(regex); enumeration
(lista); fractionDigits
(decimales).