La validación es el proceso de comprobar que un documento XML:
Si un documento solo cumple la sintaxis, es bien formado. Si además cumple las reglas del DTD, es válido.
.dtd
, y el XML lo referencia.<?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í:
<persona>
debe contener exactamente <nombre>
, <apellido>
y <edad>
.<edad>
, el XML sigue siendo bien formado pero deja de ser válido.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.
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.
(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.
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.
xmllint
).