Un DTD (Document Type Definition) es un conjunto de reglas que describe la estructura de un documento XML.
Sirve para:
En pocas palabras: un DTD es como el contrato que debe seguir un documento XML.
.dtd
separado.<!ELEMENT nombre (#PCDATA)>
nombre
: es el nombre del elemento.#PCDATA
: significa que contiene texto (Parsed Character Data).<!ELEMENT persona (nombre, apellido, edad)>
Indica que <persona>
debe contener exactamente en ese orden los elementos <nombre>
, <apellido>
y <edad>
.
<!ATTLIST persona id ID #REQUIRED>
id
: nombre del atributo.ID
: tipo de atributo (debe ser único en el documento).#REQUIRED
: obligatorio.<?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:
<!DOCTYPE ... [ ... ]>
.<persona>
debe contener <nombre>
, <apellido>
y <edad>
.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
.
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>
.<libro>
debe tener <titulo>
y <autor>
.<año>
es opcional.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>
ID
.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 -->
#PCDATA
).Por eso, en sistemas modernos se prefiere XSD, aunque DTD sigue siendo útil para entender los fundamentos de validación.