
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 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 DTD: Introducción
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 de un DTD en un archivo XML se puede realizar de dos maneras: interna, definiendo el DTD directamente dentro del archivo XML, o externa, haciendo referencia a un archivo DTD independiente.
3.1. Declaración de un DTD externo al documento XML que se encuentra de forma local o en una URL específica
La declaración de un DTD externo se coloca inmediatamente después de la definición de la versión y codificación del archivo XML, indicada por la línea <?xml version="1.0" encoding="UTF-8"?>. Esto asegura que el procesador XML reconozca las reglas definidas en el DTD antes de interpretar el contenido del documento.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rootElement SYSTEM "dtdFile.dtd">
<rootElement>
<!-- Contenido del documento XML -->
</rootElement>
Donde «rootElement» es el nombre del elemento raíz del documento XML, «SYSTEM» indica que el archivo DTD externo se encuentra localmente en una dirección accesible mediante una ruta o URL. 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.
Ejemplo:
biblioteca.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE biblioteca SYSTEM "biblioteca.dtd">
<biblioteca>
<libro>
<titulo>El Señor de los Anillos</titulo>
<autor>J.R.R. Tolkien</autor>
<anio>1954</anio>
</libro>
<libro>
<titulo>1984</titulo>
<autor>George Orwell</autor>
<anio>1949</anio>
</libro>
</biblioteca>
biblioteca.dtd
<!ELEMENT biblioteca (libro+)> <!ELEMENT libro (titulo, autor, anio)> <!ELEMENT titulo (#PCDATA)> <!ELEMENT autor (#PCDATA)> <!ELEMENT anio (#PCDATA)>
3.2. Declaración de un DTD externo al documento XML que se encuentra ubicado online con identificador único
Otra forma de declarar el DTD es con «PUBLIC«, en vez de «SYSTEM«. La declaración DTD con «PUBLIC» se utiliza para referenciar un DTD externo que está registrado con un identificador público único. Este identificador permite que los procesadores XML busquen el DTD en una ubicación común o en un repositorio. Su uso más común es cuando el DTD es genérico o está diseñado para ser compartido entre diferentes sistemas o aplicaciones.
3.3. Declaración de un DTD interno definido en el propio documento XML
La declaración de un DTD interno se realiza dentro del mismo documento XML. Este tipo de DTD se incluye entre la etiqueta DOCTYPE y define la estructura y las reglas que deben seguir los elementos y atributos dentro del documento XML. Veamos un ejemplo:
biblioteca.xml
<?xml versión="1.0" encoding="UTF-8"?>
<!DOCTYPE biblioteca [
<!ELEMENT biblioteca (libro+)>
<!ELEMENT libro (titulo, autor, anio)>
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!ELEMENT anio (#PCDATA)>
]>
<biblioteca>
<libro>
<titulo>El Señor de los Anillos</titulo>
<autor>J.R.R. Tolkien</autor>
<anio>1954</anio>
</libro>
<libro>
<titulo>1984</titulo>
<autor>George Orwell</autor>
<anio>1949</anio>
</libro>
</biblioteca>
En este ejemplo:
- La declaración
<!DOCTYPE biblioteca [ ... ]>indica que estamos definiendo un DTD interno para este documento XML. - Dentro de los corchetes
[...], se definen los elementos y sus estructuras:
<!ELEMENT biblioteca (libro+)>significa que el elementobibliotecadebe contener uno o más elementoslibro.<!ELEMENT libro (titulo, autor, anio)>define que cadalibrodebe tener untitulo, unautory unanio.<!ELEMENT titulo (#PCDATA)>,<!ELEMENT autor (#PCDATA)>y<!ELEMENT anio (#PCDATA)>indican que estos elementos deben contener datos de texto (Parsed Character Data).
La parte que hay después del DTD es el contenido del documento XML que sigue la estructura definida en el DTD.
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.
Veamos los distintos tipos de elementos:
4.1. 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-->
Por ejemplo:
<!DOCTYPE receta [
<!ELEMENT receta (titulo, ingredientes, pasos)> <!-- Declara que el elemento "receta" debe contener los elementos "titulo", "ingredientes" y "pasos", en ese orden específico.-->
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT ingredientes (ingrediente+)>
<!ELEMENT ingrediente (#PCDATA)>
<!ELEMENT pasos (paso+)>
<!ELEMENT paso (#PCDATA)>
]>
<receta>
<titulo>Tarta de Chocolate</titulo>
<ingredientes>
<ingrediente>Harina</ingrediente>
<ingrediente>Azúcar</ingrediente>
<ingrediente>Cacao en polvo</ingrediente>
</ingredientes>
<pasos>
<paso>Mezclar todos los ingredientes secos.</paso>
<paso>Hornear durante 25 minutos a 180 grados Celsius.</paso>
</pasos>
</receta>
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-->
Por ejemplo:
<!DOCTYPE productos [
<!ELEMENT productos (producto+)>
<!ELEMENT producto (telefono | tablet | laptop)> <!-- Define que el elemento producto debe contener uno de los tres elementos: telefono, tablet, o laptop.-->
<!ELEMENT telefono (#PCDATA)>
<!ELEMENT tablet (#PCDATA)>
<!ELEMENT laptop (#PCDATA)>
]>
<productos>
<producto>
<telefono>Modelo de teléfono</telefono>
</producto>
<producto>
<tablet>Modelo de tablet</tablet>
</producto>
<producto>
<laptop>Modelo de laptop</laptop>
</producto>
</productos>
4.2. Elemento vacío
Se representa con la palabra clave «EMPTY» y se utiliza para declarar elementos que no pueden contener contenido interno.
<!ELEMENT elemento EMPTY> <!--Sintaxis--> <!ELEMENT plato EMPTY> <!--Ejemplo-->
Por ejemplo:
<!DOCTYPE recetario [
<!ELEMENT recetario (plato)>
<!ELEMENT plato EMPTY>
]>
<recetario>
<plato/>
</recetario>
4.3. 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-->
Por ejemplo:
<!DOCTYPE biblioteca [
<!ELEMENT biblioteca (libro+)>
<!ELEMENT libro (titulo, autor, descripcion)>
<!ELEMENT titulo (#PCDATA)> <!-- (#PCDATA): Estos elementos están definidos para contener texto sin formato (Parsed Character Data), lo que significa que pueden contener cualquier texto. -->
<!ELEMENT autor (#PCDATA)>
<!ELEMENT descripcion (#PCDATA)>
]>
<biblioteca>
<libro>
<titulo>El Principito</titulo>
<autor>Antoine de Saint-Exupéry</autor>
<descripcion>Un pequeño príncipe viaja por el universo descubriendo la extrañeza de los adultos.</descripcion>
</libro>
<libro>
<titulo>Cien Años de Soledad</titulo>
<autor>Gabriel García Márquez</autor>
<descripcion>La historia mágica y realista de la familia Buendía en el mítico pueblo de Macondo.</descripcion>
</libro>
</biblioteca>
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. |
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.
<!DOCTYPE documento [
<!ELEMENT documento (paragraph+)>
<!ELEMENT paragraph (#PCDATA | emphasis | link)*>
<!ELEMENT emphasis (#PCDATA)>
<!ELEMENT link (#PCDATA)>
]>
<documento>
<paragraph>
Este es un ejemplo de un <emphasis>parrafo</emphasis> con texto normal,
<emphasis>texto enfatizado</emphasis>, y un <link>enlace</link>.
</paragraph>
<paragraph>
Aquí hay otro <emphasis>parrafo</emphasis> con diferentes elementos.
</paragraph>
</documento>
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:
elementoes el nombre del elemento al que se le va a declarar el atributo.atributoes el nombre del atributo que se está declarando.tipoespecifica el tipo de datos del atributo. Puede ser CDATA, enumeración o ID/IDREF.valorPredeterminadoindica el valor por defecto del atributo, si es que tiene uno. Puede ser #REQUIRED, #IMPLIED o #FIXED.
4.6.1. Valor predeterminado: #REQUIRED, #IMPLIED o #FIXED
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 no se define ninguna de las alternativas anteriores el atributo será por defecto opcional (#implied).
4.6.2. Tipo de datos del atributo: CDATA, enumeración o ID/IDREF
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 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.
SIntaxis:
<!ATTLIST elemento atributo CDATA #IMPLIED>
Ejemplo:
<!DOCTYPE galeria [
<!ELEMENT galeria (imagen+)>
<!ELEMENT imagen (#PCDATA)>
<!ATTLIST imagen descripcion CDATA #IMPLIED> <!-- Define un atributo llamado descripcion para el elemento imagen. Este atributo es opcional (#IMPLIED) y puede contener cualquier string de texto.-->
]>
<galeria>
<imagen descripcion="Una hermosa puesta de sol sobre el mar.">puesta_del_sol.jpg</imagen>
<imagen descripcion="Un retrato en blanco y negro.">retrato_bn.jpg</imagen>
<imagen>imagen_sin_descripcion.jpg</imagen>
</galeria>
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 (|).
Sintaxis:
<!ATTLIST elemento atributo (valor1 | valor2 | valor3) #IMPLIED>
Ejemplo:
<!DOCTYPE tienda [
<!ELEMENT tienda (articulo+)>
<!ELEMENT articulo (#PCDATA)>
<!ATTLIST articulo estado (disponible | agotado | oferta) #IMPLIED> <!-- Define un atributo llamado estado para el elemento articulo, el cual puede tener uno de los tres valores: disponible, agotado, o oferta. Este atributo es opcional. -->
]>
<tienda>
<articulo estado="disponible">Televisor 4K</articulo>
<articulo estado="oferta">Laptop Gamer</articulo>
<articulo estado="agotado">Smartphone XYZ</articulo>
<articulo>Mouse Inalámbrico</articulo> <!-- Sin estado especificado -->
</tienda>
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. Además, el valor de un atributo de tipo
IDdebe cumplir con las reglas de los NMTOKENs, que son cadenas de caracteres que solo pueden contener letras minúsculas, letras mayúsculas, números, puntos (.), guiones medios (-), guiones bajos (_), o el carácter dos puntos (:). Ten en cuenta también que un valor deIDdebe comenzar con una letra. - El atributo IDREF hace referencia al valor de un atributo ID existente en otro elemento.
Sintaxis:
<!ATTLIST elemento atributo ID #REQUIRED> <!ATTLIST elemento2 atributo IDREF #IMPLIED>
Ejemplo:
<!DOCTYPE red_social [
<!ELEMENT red_social (persona+)>
<!ELEMENT persona (nombre)>
<!ELEMENT nombre (#PCDATA)>
<!ATTLIST persona id ID #REQUIRED>
<!ATTLIST persona amigo_id IDREF #IMPLIED>
]>
<red_social>
<persona id="p1">
<nombre>Juan Pérez</nombre>
</persona>
<persona id="p2" amigo_id="p1">
<nombre>Maria López</nombre>
</persona>
<persona id="p3" amigo_id="p2">
<nombre>Carlos García</nombre>
</persona>
</red_social>
En este DTD:
<!ELEMENT red_social (persona+)>: Define que el documento contiene un elementored_socialque a su vez puede contener uno o más elementospersona.<!ELEMENT persona (nombre)>y<!ELEMENT nombre (#PCDATA)>: Define que cadapersonacontiene un elementonombre, el cual es un texto (PCDATA).<!ATTLIST persona id ID #REQUIRED>: Define que cadapersonadebe tener un atributoidúnico, que es obligatorio.<!ATTLIST persona amigo_id IDREF #IMPLIED>: Define que cadapersonapuede tener un atributo opcionalamigo_idque hace referencia alidde otrapersonaen el documento.
El ejemplo de XML muestra cómo se estructura un documento que utiliza este DTD, donde cada persona tiene un ID único y puede referenciar el ID de otra persona como su amigo.
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:
<!DOCTYPE articulos [
<!ENTITY autor "Eniun">
<!ENTITY sitio-web "https://www.eniun.com">
<!ELEMENT articulos (articulo+)>
<!ELEMENT articulo (titulo, contenido)>
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT contenido (#PCDATA)>
]>
<articulos>
<articulo>
<titulo>El Futuro de la Tecnología</titulo>
<contenido>
Este artículo fue escrito por &autor;. Para más información, visita &sitio-web;.
</contenido>
</articulo>
<articulo>
<titulo>Innovaciones en Inteligencia Artificial</titulo>
<contenido>
Descubre los últimos avances, cortesía de &autor;. Encuentra más detalles en &sitio-web;.
</contenido>
</articulo>
</articulos>
- 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
xmllintoxmlstarletpara validar el documento XML con la DTD asociada. Estas herramientas suelen ofrecer opciones específicas para realizar la validación y mostrar los resultados.
5.1. Validar documento XML con Visual Studio Code y la extensión XML de Red Hat
Para validar un DTD en Visual Studio Code (ver curso completo de Visual Studio Code) usando la extensión XML de Red Hat, sigue estos pasos:
- Crear o Abrir un Archivo DTD:
- Crea o abre el archivo DTD referenciado por tu archivo XML.
- Escribe o asegúrate de que el DTD esté correctamente formateado.
- Validación:
- La extensión XML de Red Hat proporciona validación en tiempo real.
- Al escribir o hacer cambios en tu archivo XML o DTD, la extensión verificará automáticamente la conformidad.
- Si hay errores, aparecerán en color rojo en el código.
- Solución de Problemas:
- Si encuentras errores, revisa las líneas indicadas en la «Vista de Problemas».
- Asegúrate de que la estructura del XML y las definiciones en el DTD coincidan.
- Corrige cualquier error que la extensión te señale.
Ejemplo
Veamos un ejemplo de la «vista de problemas» de VS Code sin errores y con errores:
Ejemplo sin errores DTD externo:
Ejemplo con errores DTD externo: Como puedes comprobar en el siguiente código, se ha definido el elemento «title» pero en el documento XML se ha puesto «titulo». Por tanto, en la vista de problemas se puede ver el elemento subrayado de color rojo.
Ejemplo con errores DTD interno:
En la siguiente sección te presentamos diferentes ejercicios resueltos para que puedas comprobar tu aprendizaje.
6. Tutorial DTD: Ejemplos
¿Quieres poner a prueba tus habilidades en XML y DTD? 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. Tutorial DTD: Ejemplo de DTD interno
En este ejemplo, se declara un DTD interno dentro del propio documento XML. El 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.
XML (libro.xml)
<?xml version="1.0" encoding="UTF-8"?> <!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. Tutorial DTD: Ejemplo de DTD externo
En este ejemplo, el archivo XML «libros.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 (libros.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)>
Esperamos que este tutorial DTD te haya sido útil para validar un documento XML asociado a una DTD, practica con los ejercicios sobre XML y DTD resueltos. Te recordamos que este tutorial se incluye dentro de una serie de cursos en los que exploramos diversos aspectos del lenguaje XML y sus tecnologías asociadas. ¡Continua tu aprendizaje con los cursos de XPath o XSD!