Validación de XML con DTD

1. ¿Qué significa validar un XML?

La validación es el proceso de comprobar que un documento XML:

  • Está bien formado (cumple las reglas de sintaxis de XML).
  • Además, respeta las reglas definidas en un DTD.

Si un documento solo cumple la sintaxis, es bien formado. Si además cumple las reglas del DTD, es válido.

2. Tipos de validación con DTD

  • DTD interno: las reglas se escriben dentro del mismo archivo XML.
  • DTD externo: las reglas se escriben en un archivo aparte .dtd, y el XML lo referencia.

3. Ejemplo de validación con 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>

Aquí:

  • El DTD define que <persona> debe contener exactamente <nombre>, <apellido> y <edad>.
  • El documento XML cumple con estas reglas → es válido.
  • Si eliminamos <edad>, el XML sigue siendo bien formado pero deja de ser válido.

4. Ejemplo de validación con 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 indica que debe validarse contra persona.dtd. Si falta un elemento, el documento no será válido.

5. Validación de atributos en un DTD

Archivo empleado.dtd

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

Archivo empleado.xml válido

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

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

El atributo id es obligatorio (#REQUIRED), por eso el XML debe incluirlo.

6. ¿Cómo validar un XML con DTD?

a) Validación en editores de texto

b) Validación en línea

c) Validación en consola con xmllint

(Linux/Mac/Windows con Cygwin)

Verificar si el XML está bien formado:

xmllint persona.xml --noout

Validar contra el DTD:

xmllint persona.xml --dtdvalid persona.dtd --noout

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

7. Ejemplo de error detectado

Archivo persona.xml (con error)

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

<persona>
    <nombre>Laura</nombre>
    <apellido>Pérez</apellido>
    <!-- Falta <edad> -->
</persona>

Resultado de validación con xmllint

persona.xml:8: element persona: Validity error : Element persona content does not follow the DTD
Expecting edad, got end tag

El validador detecta que falta el elemento <edad> definido en el DTD.

8. Resumen didáctico

  • La validación con DTD asegura que el XML no solo esté bien escrito, sino que cumpla reglas estructurales.
  • Existen dos formas de definir un DTD: interno y externo.
  • La validación puede hacerse en editores, herramientas online o consola (xmllint).
  • Si el XML no cumple las reglas del DTD, es bien formado pero no válido.