Apuntes Clase

Curso 2024-25 - IES El Rincón

Proyecto mantenido por ichigar

Validación de Documentos XML utilizando DTD

Introducción

Un DTD (Document Type Definition) es un conjunto de reglas que define la estructura, los elementos, los atributos y las entidades de un documento XML. Ayuda a asegurar que un documento XML sea válido y cumpla con una estructura predefinida. Los DTD se pueden usar para definir qué elementos están permitidos, en qué orden deben aparecer, qué atributos deben tener, y si los elementos pueden repetirse o no.

Definición de un DTD

Un DTD se puede definir de dos maneras:

DTD Interno

Un DTD interno se declara dentro de un documento XML. La declaración DOCTYPE está ubicada al inicio del archivo XML, antes de la raíz del documento.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nota [
  <!ELEMENT nota (destinatario, asunto, mensaje)>
  <!ELEMENT destinatario (#PCDATA)>
  <!ELEMENT asunto (#PCDATA)>
  <!ELEMENT mensaje (#PCDATA)>
]>
<nota>
  <destinatario>Juan Pérez</destinatario>
  <asunto>Reunión de trabajo</asunto>
  <mensaje>El informe está listo para la revisión.</mensaje>
</nota>

En este ejemplo:

DTD Externo

Un DTD externo se declara con la palabra clave DOCTYPE y hace referencia a un archivo DTD separado, que contiene las reglas para validar el documento.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nota SYSTEM "nota.dtd">
<nota>
  <destinatario>Juan Pérez</destinatario>
  <asunto>Reunión de trabajo</asunto>
  <mensaje>El informe está listo para la revisión.</mensaje>
</nota>

Archivo nota.dtd:

<!ELEMENT nota (destinatario, asunto, mensaje)>
<!ELEMENT destinatario (#PCDATA)>
<!ELEMENT asunto (#PCDATA)>
<!ELEMENT mensaje (#PCDATA)>

En este caso, el archivo nota.dtd define la estructura de nota.xml.

Proceso de validación

Una vez definido el DTD que debe cumplir un determinado documento XML debemos poder realizar el proceso de validación. Para ello existen múltiples tipos de herramientas como:

Elementos en un DTD

Un DTD describe qué elementos son permitidos y cómo deben organizarse dentro del documento. La declaración de un elemento tiene la siguiente forma:

<!ELEMENT nombre_del_elemento contenido>

Tipos de Contenido

<!ELEMENT imagen EMPTY>

Este ejemplo indica que el elemento no debería tener contenido. Debería ser de la forma: <imagen/>.

Ejemplo Completo con los Diferentes Operadores:

<!ELEMENT persona (nombre, apellido, direccion?, telefono*)>

Ejemplo de documento XML válido:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persona [
  <!ELEMENT persona (nombre, apellido, direccion?, email+, telefono*)>
  <!ELEMENT nombre (#PCDATA)>
  <!ELEMENT apellido (#PCDATA)>
  <!ELEMENT direccion (#PCDATA)>
  <!ELEMENT email (#PCDATA)>
  <!ELEMENT telefono (#PCDATA)>
]>
<persona>
  <nombre>Juan</nombre>
  <apellido>Pérez</apellido>
  <direccion>Calle Falsa 123</direccion>
  <email>jhondoe@example.com</email>
  <telefono>123456789</telefono>
  <telefono>987654321</telefono>
</persona>

Atributos de los Elementos

Los atributos permiten describir información adicional sobre los elementos. Los atributos se definen en el DTD con la siguiente sintaxis:

<!ATTLIST nombre_del_elemento atributo tipo_de_atributo valor>

Tipos de Atributos

Otros atributos que no vamos a ver con detalle, pero que podemos utilizar son:

Espacios no permitidos: Los NMTokens no pueden contener espacios en blanco.

Tipos de valores de atributos en DTD

Valor por defecto de un atributo (CDATA)

En DTD, se puede definir un valor por defecto para un atributo en la declaración <!ATTLIST> utilizando la siguiente sintaxis:

<!ATTLIST nombre_del_elemento nombre_atributo tipo_de_dato "valor_por_defecto">

Ejemplo de uso de valores por defecto

Si tienes un elemento <libro> con un atributo disponible que, por defecto, es "sí", puedes definirlo así en el DTD:

<!DOCTYPE biblioteca [
    <!ELEMENT biblioteca (libro)>
    <!ELEMENT libro (#PCDATA)>
    <!ATTLIST libro disponible CDATA "sí">
]>
<biblioteca>
    <libro>Cien años de soledad</libro>
</biblioteca>

El atributo disponible="sí" se asume automáticamente si no se especifica en el XML.

Si el usuario especifica el atributo en el XML, se usa el valor proporcionado, el valor por defecto se sobreescribe y no se aplica el valor por defecto:

<biblioteca>
    <libro disponible="no">Don Quijote</libro>
</biblioteca>

En este caso el valor "no" sobrescribe el valor por defecto "sí".

Valores requeridos, opcionales y fijos

Al definir las características de un atributo utilizando DTD le podemos asignar modificadores que empiezan por # que permiten indicar si el valor es requerido, opcional o que no puede ser modificado.

Tipo de modificador Significado
#REQUIRED Obligatorio: El XML será inválido si falta el atributo.
#IMPLIED Opcional sin valor por defecto: Puede omitirse sin problemas.
#FIXED "valor" Valor fijo: No se puede cambiar en el XML.

Ejemplo de cada caso

<!DOCTYPE biblioteca [
    <!ELEMENT biblioteca (libro+)>
    <!ELEMENT libro (#PCDATA)>
    <!ATTLIST libro disponible CDATA "sí">   <!-- Valor por defecto -->
    <!ATTLIST libro isbn CDATA #REQUIRED>    <!-- Obligatorio -->
    <!ATTLIST libro editorial CDATA #IMPLIED>  <!-- Opcional sin valor por defecto -->
    <!ATTLIST libro formato CDATA #FIXED "digital"> <!-- Fijo, no se puede cambiar -->
]>

Ejemplo XML válido con esta definición:

<biblioteca>
    <libro isbn="978-3-16-148410-0">Cien años de soledad</libro>
    <libro isbn="978-84-376-0494-7" disponible="no" editorial="Alfaguara">Don Quijote</libro>
</biblioteca>

Explicación:

Nota: De forma opcional se pueden definir todos los atributos de un elemento en un único ATTLIST:

<!ATTLIST libro 
    isbn CDATA #REQUIRED
    editorial CDATA #IMPLIED
    formato CDATA #FIXED "digital"
>