Definición de DTD (Document Type Definition)

1. ¿Qué es un DTD?

Un DTD (Document Type Definition) es un conjunto de reglas que describe la estructura de un documento XML.

Sirve para:

  • Especificar qué elementos y atributos pueden aparecer.
  • Definir el orden de los elementos.
  • Establecer qué elementos son obligatorios y cuáles opcionales.
  • Garantizar que un documento XML sea válido, no solo bien formado.

En pocas palabras: un DTD es como el contrato que debe seguir un documento XML.

2. Tipos de DTD

  • DTD interno: las reglas están dentro del mismo archivo XML.
  • DTD externo: las reglas están en un archivo .dtd separado.

3. Sintaxis de un DTD

a) Definir un elemento

<!ELEMENT nombre (#PCDATA)>
  • nombre: es el nombre del elemento.
  • #PCDATA: significa que contiene texto (Parsed Character Data).

b) Definir un elemento compuesto

<!ELEMENT persona (nombre, apellido, edad)>

Indica que <persona> debe contener exactamente en ese orden los elementos <nombre>, <apellido> y <edad>.

c) Definir un atributo

<!ATTLIST persona id ID #REQUIRED>
  • id: nombre del atributo.
  • ID: tipo de atributo (debe ser único en el documento).
  • #REQUIRED: obligatorio.

4. Ejemplo de DTD interno

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE persona [
    <!ELEMENT persona (nombre, apellido, edad)>
    <!ELEMENT nombre (#PCDATA)>
    <!ELEMENT apellido (#PCDATA)>
    <!ELEMENT edad (#PCDATA)>
]>

<persona>
    <nombre>Laura</nombre>
    <apellido>Pérez</apellido>
    <edad>30</edad>
</persona>

Explicación:

  • El DTD está definido dentro de <!DOCTYPE ... [ ... ]>.
  • La regla dice que <persona> debe contener <nombre>, <apellido> y <edad>.
  • El XML respeta estas reglas, por eso es válido.

5. Ejemplo de DTD externo

Archivo persona.dtd

<!ELEMENT persona (nombre, apellido, edad)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellido (#PCDATA)>
<!ELEMENT edad (#PCDATA)>

Archivo persona.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persona SYSTEM "persona.dtd">

<persona>
    <nombre>Juan</nombre>
    <apellido>Gómez</apellido>
    <edad>25</edad>
</persona>

Aquí el archivo persona.xml hace referencia al archivo externo persona.dtd.

6. Definición de ocurrencias en DTD

DTD permite controlar cuántas veces puede aparecer un elemento:

  • ?: opcional (0 o 1 vez).
  • *: puede aparecer 0 o más veces.
  • +: debe aparecer 1 o más veces.

Ejemplo:

<!ELEMENT biblioteca (libro+)>
<!ELEMENT libro (titulo, autor, año?)>
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!ELEMENT año (#PCDATA)>

XML válido:

<biblioteca>
    <libro>
        <titulo>1984</titulo>
        <autor>George Orwell</autor>
    </libro>
    <libro>
        <titulo>Don Quijote</titulo>
        <autor>Miguel de Cervantes</autor>
        <año>1605</año>
    </libro>
</biblioteca>

Reglas:

  • <biblioteca> debe contener uno o más <libro>.
  • Cada <libro> debe tener <titulo> y <autor>.
  • <año> es opcional.

7. Definición de atributos en DTD

Con <!ATTLIST> podemos definir atributos para los elementos.

Ejemplo:

<!ELEMENT empleado (nombre, puesto)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT puesto (#PCDATA)>
<!ATTLIST empleado id ID #REQUIRED>

XML válido:

<empleado id="E001">
    <nombre>María</nombre>
    <puesto>Analista</puesto>
</empleado>

8. Tipos de atributos en DTD

  • CDATA: cualquier cadena de texto.
  • ID: identificador único en el documento.
  • IDREF / IDREFS: referencia(s) a un ID.
  • Enumeración: valores restringidos a una lista.

Ejemplo con enumeración:

<!ATTLIST producto estado (nuevo | usado | defectuoso) "nuevo">

El atributo estado solo puede tomar uno de esos 3 valores. Si no se especifica, por defecto es "nuevo".

XML válido:

<producto estado="usado">Celular</producto>

XML inválido:

<producto estado="reciclado">Celular</producto> <!-- Error -->

9. Limitaciones de DTD

  • No distingue tipos de datos más allá de texto (#PCDATA).
  • No permite definir números, fechas, booleanos de forma estricta (solo cadenas).
  • Tiene menos expresividad que XML Schema (XSD).

Por eso, en sistemas modernos se prefiere XSD, aunque DTD sigue siendo útil para entender los fundamentos de validación.

10. Resumen didáctico

  • El DTD define las reglas que debe seguir un XML para ser válido.
  • Puede estar interno (dentro del XML) o externo (archivo separado).
  • Permite definir: elementos y su contenido, orden y ocurrencia de elementos, atributos y sus restricciones.
  • Es más limitado que XSD, pero esencial para comprender la validación en XML.