Introducción a XML Schema (XSD)

1. ¿Qué es XML Schema (XSD)?

Un XML Schema, también conocido como XSD (XML Schema Definition), es un lenguaje basado en XML que define las reglas de validación de un documento XML.

Es similar a un DTD, pero mucho más avanzado, porque:

  • Está escrito en XML (más legible y estructurado).
  • Permite definir tipos de datos (string, integer, date, boolean, etc.).
  • Permite establecer restricciones (longitud mínima, valores numéricos, patrones).
  • Soporta herencia y reutilización de definiciones.

2. Diferencias entre DTD y XSD

  • Sintaxis: DTD (propia, no XML) vs. XSD (basado en XML).
  • Tipos de datos: DTD (solo texto) vs. XSD (tipos simples y complejos: string, int, date, boolean, etc.).
  • Restricciones: DTD (limitadas) vs. XSD (longitud, rango, patrones, etc.).
  • Namespaces: DTD (no soporta) vs. XSD (sí soporta).
  • Reutilización: DTD (muy limitada) vs. XSD (altamente reutilizable).

Por eso, hoy en día XSD ha reemplazado al DTD en la mayoría de sistemas.

3. Estructura básica de un XML Schema

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <!-- Definiciones aquí -->
</xs:schema>
  • xs: es el prefijo estándar para los elementos del esquema.
  • http://www.w3.org/2001/XMLSchema es el namespace oficial de XML Schema.

4. Ejemplo simple de XSD

Archivo persona.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- Definición del elemento raíz -->
  <xs:element name="persona">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="nombre" type="xs:string"/>
        <xs:element name="apellido" type="xs:string"/>
        <xs:element name="edad" type="xs:integer"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

Reglas definidas en este XSD:

  • El elemento raíz es <persona>.
  • Debe contener, en ese orden: <nombre>, <apellido>, <edad>.
  • nombre y apellido: texto (xs:string).
  • edad: número entero (xs:integer).

Archivo persona.xml válido

<?xml version="1.0" encoding="UTF-8"?>
<persona xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="persona.xsd">
    <nombre>Ana</nombre>
    <apellido>Pérez</apellido>
    <edad>30</edad>
</persona>

Archivo persona.xml inválido

<persona>
    <nombre>Ana</nombre>
    <apellido>Pérez</apellido>
    <edad>treinta</edad>
</persona>

Inválido porque edad debe ser un número entero (xs:integer), no texto.

5. Tipos de datos en XSD

XSD soporta muchos tipos de datos predefinidos:

  • xs:string: texto.
  • xs:integer: enteros.
  • xs:decimal: números con decimales.
  • xs:boolean: true o false.
  • xs:date: fecha (YYYY-MM-DD).
  • xs:time: hora (HH:MM:SS).

Ejemplo:

<xs:element name="activo" type="xs:boolean"/>
<xs:element name="salario" type="xs:decimal"/>
<xs:element name="fechaNacimiento" type="xs:date"/>

6. Restricciones en XSD

Además de definir tipos de datos, se pueden establecer restricciones.

Edad entre 0 y 120:

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

Nombre con mínimo 3 y máximo 50 caracteres:

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

7. Validación con XSD

a) Referencia dentro del XML

<persona xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="persona.xsd">
    <nombre>Laura</nombre>
    <apellido>Gómez</apellido>
    <edad>28</edad>
</persona>
  • xmlns:xsi habilita el uso de atributos de esquema.
  • xsi:noNamespaceSchemaLocation="persona.xsd" indica dónde está el archivo XSD.

b) Validación con xmllint

xmllint --noout --schema persona.xsd persona.xml

Si es válido, no muestra nada. Si hay errores, indica línea y motivo.

8. Ejemplo completo con XSD

Archivo biblioteca.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="biblioteca">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="libro" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="titulo" type="xs:string"/>
              <xs:element name="autor" type="xs:string"/>
              <xs:element name="año" type="xs:integer"/>
            </xs:sequence>
            <xs:attribute name="id" type="xs:string" use="required"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

Archivo biblioteca.xml válido

<?xml version="1.0" encoding="UTF-8"?>
<biblioteca xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:noNamespaceSchemaLocation="biblioteca.xsd">

    <libro id="L1">
        <titulo>1984</titulo>
        <autor>George Orwell</autor>
        <año>1949</año>
    </libro>

    <libro id="L2">
        <titulo>Don Quijote</titulo>
        <autor>Miguel de Cervantes</autor>
        <año>1605</año>
    </libro>

</biblioteca>

9. Resumen didáctico

  • XSD (XML Schema) es más potente y moderno que DTD.
  • Se escribe en XML, lo que lo hace más legible y flexible.
  • Permite definir tipos de datos, restricciones y estructuras complejas.
  • Permite validar documentos XML de forma más estricta.
  • Es el estándar actual para garantizar que los documentos XML cumplen con reglas bien definidas.