Tutorial DTD (Document Type Definition)

En este tutorial de DTD se explican los conceptos fundamentales para comprender y utilizar el Document Type Definition (DTD).
En este tutorial, aprenderás cómo crear un DTD, cómo definir elementos y atributos, y cómo establecer reglas de validación para garantizar la integridad y la coherencia de tus documentos XML. Descubrirás cómo especificar la estructura jerárquica de los elementos, cómo definir los tipos de datos permitidos y cómo establecer restricciones y relaciones entre ellos.
Además, exploraremos las diferentes opciones y características avanzadas de los DTD, como la definición de entidades, la inclusión de elementos externos y la reutilización de definiciones. Aprenderás cómo aprovechar al máximo el potencial de los DTD para crear documentos XML bien estructurados y válidos.
Si estás interesado en dominar el arte de definir y validar documentos XML con DTD, este tutorial te proporcionará los conocimientos necesarios para empezar. Sin embargo, si aún no sabes cómo crear un documento XML te recomendamos comenzar el con el tutorial de introducción a XML.
1. Tutorial: Introducción a DTD
DTD(Document Type Definition, Definición de Tipo de Documento) es un lenguaje de marcado utilizado para definir la estructura y los tipos de datos permitidos en un documento XML. Proporciona un conjunto de reglas y especificaciones que permiten validar y verificar la conformidad de un documento XML con respecto a su estructura y contenido.
Es importante destacar que, en ausencia de un DTD, cualquier etiqueta que aparezca en un documento XML se considerará válida. En este caso, el parser solo puede verificar si el documento está bien formado, es decir, si sigue las reglas básicas de sintaxis del lenguaje XML.
No obstante, en entornos profesionales donde se utiliza XML, es fundamental especificar un DTD que defina de manera formal el lenguaje de etiquetado requerido. Esto debe hacerse como primer paso antes de comenzar a escribir cualquier documento XML. Al definir un DTD, se establecen reglas específicas sobre los elementos permitidos, los atributos que pueden contener, la estructura jerárquica y otras restricciones.
2. Importancia de definir un DTD
La existencia de un DTD permite garantizar que los documentos XML creados cumplan con las reglas y requisitos establecidos por el lenguaje. Esto ayuda a mantener la consistencia y la integridad de los documentos, así como facilitar el intercambio de datos entre diferentes sistemas y aplicaciones que utilizan XML. Por lo tanto, es esencial definir un DTD adecuado para asegurar la correcta interpretación y validación de los documentos XML en un entorno profesional.
3. Declaración del DTD
La declaración del DTD se encuentra al principio del documento y proporciona información sobre el tipo de documento que se está utilizando.
La sintaxis básica de la declaración de un DTD es la siguiente:
<!DOCTYPE rootElement SYSTEM "dtdFile.dtd">
Donde «rootElement» es el nombre del elemento raíz del documento XML, «SYSTEM» indica que el archivo DTD externo se encuentra localmente o en una ubicación de acceso específica y «dtdFile.dtd» es el nombre del archivo que contiene la definición del DTD o la URL en la que se encuentra el archivo.
Otra forma de declarar el DTD es con «PUBLIC«, en vez de «SYSTEM«. La declaración DTD con «PUBLIC» se utiliza cuando se proporciona un identificador público único junto con la ubicación del archivo DTD externo, permitiendo referenciar y acceder al DTD desde ubicaciones públicas y accesibles en línea. Mientras que, la declaración DTD con «SYSTEM» se utiliza cuando se especifica la ubicación del archivo DTD externo en el sistema de archivos local o en una ubicación específica.
Declaración DTD usando la opción «PUBLIC«:
<!DOCTYPE libro PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
En este ejemplo, la declaración DTD especifica un identificador público («-//W3C//DTD XHTML 1.0 Strict//EN») que identifica la definición DTD del estándar XHTML 1.0 Strict. Luego, se proporciona la ubicación del archivo DTD externo que contiene la definición del DTD.
Es importante destacar que la declaración del DTD es opcional en un documento XML. Sin embargo, su inclusión es altamente recomendada, especialmente en entornos profesionales, ya que proporciona una estructura definida y facilita la validación y el procesamiento del documento.
4. Declaración de tipos de elementos
En DTD, la declaración de tipos de elementos se utiliza para definir la estructura y composición de los elementos en un documento XML. Permite especificar qué elementos son válidos en el documento y qué elementos pueden contener.
La sintaxis básica para la declaración de tipos de elementos en DTD es la siguiente:
<!ELEMENT elemento tipo> <!--Sintaxis-->
Donde «elemento» es el nombre del elemento que se está declarando y «tipo» es el tipo de elemento que se está especificando.
Hay diferentes tipos de elementos que se pueden utilizar en la declaración de tipos de elementos:
4.1. Elemento vacío
Se representa con la palabra clave «EMPTY» y se utiliza para declarar elementos que no pueden contener contenido interno. Por ejemplo:
<!ELEMENT elemento EMPTY> <!--Sintaxis--> <!ELEMENT plato EMPTY> <!--Ejemplo-->
4.2. Elemento que contiene datos
Se representa con la palabra clave «PCDATA» (Parsed Character Data) y se utiliza para declarar elementos que pueden contener texto sin formato. Por ejemplo:
<!ELEMENT elemento (#PCDATA)> <!--Sintaxis--> <!ELEMENT titulo (#PCDATA)> <!--Ejemplo-->
4.3. Elemento con contenido estructurado
Se utiliza para declarar elementos que tienen una estructura específica y pueden contener otros elementos en un orden determinado. Se especifica mediante una combinación de elementos y operadores. Se distinguen varios tipos:
Secuenciales (contiene elementos hijos):
<!ELEMENT elemento (subelemento1, subelemento2, subelemento3)> <!--Sintaxis--> <!ELEMENT receta (titulo, ingredientes, pasos)> <!--Ejemplo-->
Enumeración o alternativos (contiene uno y solo uno de los elementos hijos):
<!ELEMENT elemento (subelemento1 | subelemento2 | subelemento3)> <!--Sintaxis--> <!ELEMENT producto (telefono | tablet | laptop)> <!--Ejemplo-->
4.4. Elementos con factor de repetición
El factor de repetición en DTD nos permite establecer cuántas veces puede aparecer un elemento o grupo de elementos dentro de otro elemento.
Carácter | Descripción |
---|---|
* | El elemento o grupo de elementos puede repetirse 0 o más veces. |
? | El elemento o grupo de elementos puede aparecer 0 o 1 vez. |
+ | El elemento o grupo de elementos puede repetirse 1 o más veces. |
N/A | Por defecto, el elemento debe aparecer una vez. (No se especifica carácter) |
A continuación se muestran varios ejemplos de cómo se utilizan los caracteres de factor de repetición:
- Carácter ‘*’ (cero o más repeticiones):
<!ELEMENT elementos (elemento*)>
En este ejemplo, el elemento «elementos» puede contener cero o más repeticiones del elemento «elemento». Por ejemplo:
<elementos> <elemento>Texto 1</elemento> <elemento>Texto 2</elemento> </elementos>
Pero también puede no contener ningún elemento:
<elementos></elementos>
- Carácter ‘?’ (cero o una repetición):
<!ELEMENT elemento (subelemento?)>
En este ejemplo, el elemento «elemento» puede contener cero o una repetición del elemento «subelemento». Por ejemplo:
<elemento> <subelemento>Texto</subelemento> </elemento>
Pero también puede no contener el elemento «subelemento»:
<elemento></elemento>
- Carácter ‘+’ (una o más repeticiones):
<!ELEMENT elementos (elemento+)>
En este ejemplo, el elemento «elementos» debe contener al menos una repetición del elemento «elemento», pero puede contener más. Por ejemplo:
<elementos> <elemento>Texto 1</elemento> <elemento>Texto 2</elemento> </elementos>
Pero no puede estar vacío:
<elementos></elementos>
- Por defecto (una repetición):
Si no especificamos ningún carácter de factor de repetición, se asume que el elemento debe aparecer una vez. Por ejemplo:
<!ELEMENT elemento subelemento>
En este ejemplo, el elemento «elemento» debe contener una repetición del elemento «subelemento». Por ejemplo:
<elemento> <subelemento>Texto</subelemento> </elemento>
No puede estar vacío ni tener más de una repetición.
4.5. Elementos mixtos
En DTD, se pueden declarar elementos mixtos que permiten la combinación de contenido de texto y otros elementos dentro del mismo elemento. Para declarar un elemento mixto, se utiliza la siguiente sintaxis:
<!ELEMENT elemento (#PCDATA | subelemento)*>
En esta declaración, elemento
es el nombre del elemento mixto. (#PCDATA | subelemento)*
indica que el elemento puede contener contenido de texto (#PCDATA
) y/o el subelemento especificado. El asterisco (*) al final indica que el contenido puede repetirse cero o más veces.
A continuación se muestra un ejemplo visual de una declaración de elemento mixto en DTD:
<!ELEMENT paragraph (#PCDATA | emphasis | link)*>
En este ejemplo, el elemento paragraph
puede contener texto (#PCDATA
) y/o los elementos emphasis
y link
. Pueden haber cero o más repeticiones de estos elementos dentro de un paragraph
.
4.6. Declaración de tipos de atributos
Mediante DTD se pueden declarar los tipos de atributos que pueden tener los elementos en un documento XML. La sintaxis para la declaración de tipos de atributos en DTD es la siguiente:
<!ATTLIST elemento atributo tipo valorPredeterminado>
Donde:
elemento
es el nombre del elemento al que se le va a declarar el atributo.atributo
es el nombre del atributo que se está declarando.tipo
especifica el tipo de datos del atributo. Puede ser CDATA, enumeración o ID/IDREF.valorPredeterminado
indica el valor por defecto del atributo, si es que tiene uno. Puede ser #REQUIRED, #IMPLIED o #FIXED.
4.6.1. Tipo de datos del atributo
En la especificación DTD se pueden declarar diferentes tipos de atributos para los elementos de un documento XML. Los tipos de atributos más comunes son CDATA, enumeración y ID/IDREF.
Atributo CDATA:
- CDATA es el tipo más simple y común de atributo en XML.
- Permite cualquier tipo de datos de caracteres, incluyendo texto, números, símbolos y caracteres especiales.
- No se aplican restricciones especiales a los valores del atributo.
Ejemplo:
<!ATTLIST elemento atributo CDATA #IMPLIED>
Atributo Enumeración:
- El atributo puede tener un conjunto específico de valores predefinidos.
- Solo se pueden usar los valores enumerados en el atributo.
- Se declaran los valores posibles dentro de paréntesis y separados por tuberías (|).
Ejemplo:
<!ATTLIST elemento atributo (valor1 | valor2 | valor3) #IMPLIED>
Atributo ID/IDREF:
- Los atributos ID y IDREF se utilizan para establecer relaciones únicas entre elementos en un documento XML.
- El atributo ID debe ser un identificador único en todo el documento.
- El atributo IDREF hace referencia al valor de un atributo ID existente en otro elemento.
Ejemplo:
<!ATTLIST elemento atributo ID #REQUIRED> <!ATTLIST elemento2 atributo IDREF #IMPLIED>
4.6.2. Valor por defecto del atributo
Además del nombre y el tipo del atributo también se puede especificar cómo debe
comportarse el parser ante la presencia o ausencia de cierto atributo en un elemento
del documento. Existen cuatro posibles alternativas:
● #REQUIRED. El atributo es de carácter obligatorio.
● #IMPLIED. El atributo es opcional.
● #FIXED. El atributo tiene un valor fijo declarado en el DTD.
● Valor por defecto. Si el atributo no está declarado toma este valor.
Si no se define ninguna de estas alternativas el atributo será por defecto opcional.
4.6.3. Ejemplos de declaraciones de atributos
A continuación se muestran ejemplos de declaraciones de tipos de atributos en DTD:
<!ATTLIST libro titulo CDATA #REQUIRED>
En este ejemplo, se declara el atributo «titulo» para el elemento «libro» con tipo CDATA. El atributo es requerido, lo que significa que debe estar presente en el elemento.
<!ATTLIST producto categoria (electronicos | ropa | libros) "electronicos">
En este ejemplo, se declara el atributo «categoria» para el elemento «producto» con tipo enumeración. El atributo puede tener uno de los valores: «electronicos», «ropa» o «libros». El valor predeterminado es «electronicos».
<!ATTLIST empleado id ID #REQUIRED>
En este ejemplo, se declara el atributo «id» para el elemento «empleado» con tipo ID. El atributo es requerido y debe ser un identificador único en el documento.
4.7. Declaración de entidades
En la especificación DTD, las entidades son utilizadas para definir símbolos o fragmentos de texto que pueden ser referenciados y utilizados en diferentes partes del documento XML. Hay dos tipos principales de entidades: entidades internas y entidades externas.
- Declaración de entidades internas:
- Las entidades internas se definen dentro del propio documento DTD.
- Se utilizan para definir símbolos o fragmentos de texto que pueden ser sustituidos en el contenido del documento.
- La sintaxis para declarar una entidad interna es la siguiente:
<!ENTITY nombre "valor">
Donde «nombre» es el nombre de la entidad y «valor» es el texto o símbolo que representa la entidad. Ejemplo de declaración de entidad interna:
<!ENTITY autor "Eniun"> <!ENTITY sitio-web "https://www.eniun.com">
- Declaración de entidades externas:
- Las entidades externas se definen fuera del documento DTD, en archivos separados.
- Se utilizan para definir contenido que puede ser referenciado desde múltiples documentos XML.
- La sintaxis para declarar una entidad externa es la siguiente:
<!ENTITY nombre SYSTEM "ruta/del/archivo">
Donde «nombre» es el nombre de la entidad y «ruta/del/archivo» es la ubicación del archivo que contiene el valor de la entidad. Ejemplo de declaración de entidad externa:
<!ENTITY datosExternos SYSTEM "datos.xml">
Una vez que se definen las entidades, se pueden utilizar en el contenido del documento XML utilizando la referencia de entidad. Para referenciar una entidad en el documento, se utiliza su nombre precedido por el símbolo «&» y seguido por «;».
Ejemplo de uso de entidades en el contenido del documento XML:
<libro> <titulo>&autor; - Mi libro</titulo> <sitio>&sitio-web;</sitio> </libro>
Al utilizar entidades, se puede mejorar la legibilidad, la reutilización de contenido y la fácil actualización de los valores en todo el documento XML.
5. Cómo validar un documento XML asociado a un DTD
Para validar un documento XML asociado a un DTD, puedes seguir estos pasos:
- Crea un archivo XML válido que esté asociado a un DTD tal y como hemos visto en este tutorial.
- Utiliza una herramienta o método para validar el documento XML con la DTD asociada:
- Editor de código y algún complemento que permita la validación de XML con DTD. Por ejemplo Visual Studio Code y la extensión XML de Red Hat.
- Herramientas online como truugo.com/xml_validator/.
- Programa específico como XMLSpy, Oxygen XML Editor o Altova XMLSpy.
- Herramientas en línea de comandos: Si estás trabajando en un entorno de línea de comandos, puedes utilizar herramientas como
xmllint
oxmlstarlet
para validar el documento XML con la DTD asociada. Estas herramientas suelen ofrecer opciones específicas para realizar la validación y mostrar los resultados.
Ten en cuenta que la validación del XML con DTD verifica la estructura y la conformidad del documento XML con las reglas definidas en la DTD. Sin embargo, las DTD tienen limitaciones y no son tan flexibles ni poderosas como otras tecnologías de validación más modernas, como los esquemas XML (XSD) o la validación basada en lenguajes como RelaxNG o Schematron.
En la siguiente sección te presentamos diferentes ejercicios resueltos para que puedas comprobar tu aprendizaje.
6. Ejemplos y ejercicios resueltos DTD
¿Quieres poner a prueba tus habilidades en XML? Los ejercicios de XML te permitirán practicar la creación de documentos, definir DTDs y mucho más. Si no lo has hecho ya, antes de comenzar con los ejercicios de DTD, es recomendable que veas los ejercicios resueltos de XML.
6.1. Ejemplo de DTD interno
En este ejemplo, se declara una DTD interna dentro del propio documento XML. La DTD define la estructura y los tipos de elementos permitidos en el documento. En este caso, se define el elemento raíz «libro» que debe contener los elementos «titulo», «autor» y «anio».
Cada elemento se declara utilizando la sintaxis <!ELEMENT nombre tipo>
, donde «nombre» es el nombre del elemento y «tipo» especifica el tipo de contenido permitido. En este caso, se utiliza el tipo «#PCDATA» que indica que el contenido del elemento es texto plano.
<!DOCTYPE libro [ <!ELEMENT libro (titulo, autor, anio)> <!ELEMENT titulo (#PCDATA)> <!ELEMENT autor (#PCDATA)> <!ELEMENT anio (#PCDATA)> ]> <libro> <titulo>Clean Code: A Handbook of Agile Software Craftsmanship</titulo> <autor>Robert C. Martin</autor> <anio>2008</anio> </libro>
6.2. Ejemplo de DTD externo
En este ejemplo, el archivo XML «archivo.xml» hace referencia al DTD externo «libros.dtd» mediante la declaración DOCTYPE. El DTD define la estructura y las reglas de validación para el elemento «libros» y sus elementos hijos «libro», «titulo», «autor» y «anio». El DTD especifica que «libros» puede contener cero o más elementos «libro» y que cada «libro» debe contener los elementos «titulo», «autor» y «anio». Los elementos «titulo», «autor» y «anio» se definen como elementos de datos de texto (#PCDATA).
Al utilizar un DTD externo, se separa la definición de la estructura del documento XML en un archivo aparte, lo cual permite reutilizar el mismo DTD en múltiples documentos XML. Esto facilita la gestión y mantenimiento de los esquemas de validación.
XML (archivo.xml):
<!DOCTYPE libros SYSTEM "libros.dtd"> <libros> <libro> <titulo>HTML y CSS: Diseño y construcción de sitios web</titulo> <autor>Jon Duckett</autor> <anio>2011</anio> </libro> <libro> <titulo>Responsive Web Design</titulo> <autor>Ethan Marcotte</autor> <anio>2011</anio> </libro> </libros>
DTD (libros.dtd):
<!ELEMENT libros (libro*)> <!ELEMENT libro (titulo, autor, anio)> <!ELEMENT titulo (#PCDATA)> <!ELEMENT autor (#PCDATA)> <!ELEMENT anio (#PCDATA)>
6.3. Tutorial DTD. Ejercicio resuelto: Biblioteca XML
Crea un archivo XML que represente una biblioteca virtual. La biblioteca debe contener tanto libros como revistas, cada uno con su información correspondiente. Sigue las instrucciones y utiliza el DTD proporcionado para validar el documento XML.
Instrucciones:
- Crea un documento XML que cumpla con el DTD proporcionado para una biblioteca.
- Agrega al menos dos libros a la biblioteca. Cada libro debe tener un título, autor, editorial, año de publicación, precio y una descripción opcional.
- Asegúrate de incluir también una imagen para cada libro.
- Agrega al menos una revista a la biblioteca. La revista debe tener un título, editorial, año de publicación, precio y al menos un artículo.
- Cada artículo debe tener un título, autor y contenido.
DTD:
<!DOCTYPE biblioteca [ <!ELEMENT biblioteca (libro*, revista*)> <!ELEMENT libro (titulo, autor, editorial, anio, precio, descripcion?, imagen?)> <!ELEMENT titulo (#PCDATA)> <!ELEMENT autor (#PCDATA)> <!ELEMENT editorial (#PCDATA)> <!ELEMENT anio (#PCDATA)> <!ELEMENT precio (#PCDATA)> <!ELEMENT descripcion (#PCDATA)> <!ELEMENT imagen (#PCDATA)> <!ELEMENT revista (titulo, editorial, anio, precio, articulo*)> <!ELEMENT articulo (titulo, autor, contenido)> <!ELEMENT contenido (#PCDATA)> <!ATTLIST libro id CDATA #REQUIRED> <!ATTLIST libro formato (impreso|digital) "impreso"> <!ATTLIST libro idioma CDATA #IMPLIED> <!ENTITY % desc "Un libro interesante sobre programación"> <!ENTITY % imagen "portada.jpg"> <!ENTITY euro "€"> ]>
Solución:
<biblioteca> <libro id="L1" formato="impreso" idioma="es"> <titulo>XML en profundidad</titulo> <autor>John Smith</autor> <editorial>Editorial A</editorial> <anio>2020</anio> <precio>25€</precio> <descripcion>%desc;</descripcion> <imagen>%imagen;</imagen> </libro> <libro id="L2" formato="digital" idioma="en"> <titulo>Web Design Principles</titulo> <autor>Emily Johnson</autor> <editorial>Editorial B</editorial> <anio>2019</anio> <precio>19.99€</precio> <descripcion>Learn the fundamental principles of web design.</descripcion> <imagen>web-design.jpg</imagen> </libro> <revista> <titulo>Revista de Diseño Web</titulo> <editorial>Editorial Pixel Vivo</editorial> <anio>2021</anio> <precio>12.50€</precio> <articulo> <titulo>Las tendencias actuales en diseño web</titulo> <autor>Jorge Juan Oliva</autor> <contenido>Este artículo explora las últimas tendencias en diseño web...</contenido> </articulo> </revista> </biblioteca>
6.4. Tutorial DTD. Ejercicio resuelto. Gestión de tareas
Considera un sistema de gestión de tareas que se va a implementar en XML. Diseña un DTD que permita representar las tareas con sus respectivos atributos, como el título, la descripción, la fecha de creación y la prioridad. Además, cada tarea puede tener subtareas anidadas.
Define el elemento raíz «tareas» que puede contener una o más tareas. Cada tarea está compuesta por elementos obligatorios como «titulo», «descripcion», «fecha» y «prioridad», y puede tener un elemento opcional «subtareas» para anidar subtareas. Además, agrega un atributo «id» a cada tarea para identificarlas de forma única.
Solución:
<!DOCTYPE tareas [ <!ELEMENT tareas (tarea+)> <!ELEMENT tarea (titulo, descripcion, fecha, prioridad, subtareas?)> <!ELEMENT titulo (#PCDATA)> <!ELEMENT descripcion (#PCDATA)> <!ELEMENT fecha (#PCDATA)> <!ELEMENT prioridad (#PCDATA)> <!ELEMENT subtareas (tarea+)> <!ATTLIST tarea id ID #REQUIRED> ]>
6.5. Tutorial DTD. Ejercicio resuelto. Sistema de gestión de eventos
Imagina que estás diseñando un sistema de gestión de eventos. Cada evento tiene un título, una descripción, una fecha y una ubicación. Además, puede tener una lista de invitados. Diseña un DTD que permita representar estos eventos de manera válida.
Define el elemento raíz «eventos» que puede contener uno o más elementos «evento». Cada evento está compuesto por elementos obligatorios como «titulo», «descripcion», «fecha» y «ubicacion». Además, agrega un elemento opcional «invitados» que puede contener una lista de invitados representados por el elemento «invitado». El contenido de «invitado» defínelo como texto, pero podría ser una estructura más compleja según los requisitos del sistema de gestión de eventos.
Crea también un documento XML que cumpla con el DTD.
Solución:
<!DOCTYPE eventos [ <!ELEMENT eventos (evento+)> <!ELEMENT evento (titulo, descripcion, fecha, ubicacion, invitados?)> <!ELEMENT titulo (#PCDATA)> <!ELEMENT descripcion (#PCDATA)> <!ELEMENT fecha (#PCDATA)> <!ELEMENT ubicacion (#PCDATA)> <!ELEMENT invitados (invitado+)> <!ELEMENT invitado (#PCDATA)> ]> <eventos> <evento> <titulo>Conferencia de Diseño Web</titulo> <descripcion>Una conferencia para diseñadores web</descripcion> <fecha>2023-10-15</fecha> <ubicacion>Centro de Convenciones</ubicacion> <invitados> <invitado>Andrea Lluch</invitado> <invitado>Jorge Juan Oliva</invitado> </invitados> </evento> <evento> <titulo>Taller de Programación</titulo> <descripcion>Un taller práctico sobre programación</descripcion> <fecha>2023-11-02</fecha> <ubicacion>IES Severo Ochoa</ubicacion> </evento> </eventos>
Esperamos que este tutorial te haya sido útil para validar un documento XML asociado a una DTD. Te recordamos que este tutorial se incluye dentro de una serie de tutoriales en los que exploramos diversos aspectos del lenguaje XML y sus tecnologías asociadas. ¡Continua tu aprendizaje con los tutoriales de XPath o XSD y explora el fascinante mundo de XML!