Está en la página 1de 9

XML Lenguaje de presentacin de datos

Tema 3. DTD

3. DTD
Cabe hacer hincapi en que cuando un documento XML no contiene un DTD, cualquier etiqueta
que aparezca en el mismo se considerar vlida. De manera que el parser solo podr comprobar que
el documento est bien formado. La existencia del DTD permite asegurar que los documentos
siguen las reglas del lenguaje.
Cuando se pretende usar XML en un entorno profesional, es imprescindible la especificacin de un
DTD que defina formalmente el lenguaje de etiquetado requerido. Este debe ser el primer paso
antes de escribir ningn documento XML. Se puede observar una cierta similitud con la forma de
trabajo con una base de datos. Donde el primer paso es la definicin del esquema y posteriormente
el resto de usuarios ya pueden trabajar contra este esquema.
En el captulo anterior hemos visto cmo crear documentos XML bien formados. En este captulo
vamos a conseguir crear documentos bien formados y vlidos. Por ejemplo, el primer ejercicio del
captulo anterior versaba sobre un documento XML que una empresa mandaba a un sitio web para
ofertar ciertos artculos (coches). Imaginemos que muchas empresas mandan informacin a este
sitio web y cada una de ellas implementa su propia versin de documento XML. El sitio web debe
ser capaz de entender todos los documentos que le llegan y tratar la informacin que contienen.
Esto es inviable. La solucin ptima es que la empresa web anunciante cree un DTD donde define
cmo deben ser exactamente los documentos que va a recibir. Todas las empresas que quieran
anunciar productos enviaran documentos XML validados por esta DTD (ya veremos cmo ms
adelante). De esta forma nos aseguramos que el sitio web va a recibir documentos XML vlidos.
Objetivos.
Conocer los elementos principales que contiene un DTD. Saber crear DTD para definir gramticas
sencillas. Saber crear documentos XML bien formados y vlidos. Saber validar un XML contra su
DTD asociado.
Contenido.
3.1.
3.2.
3.3.
3.4.
3.5.
3.6.

Declaracin del DTD


Declaracin de tipos de elementos
Declaracin de tipos de atributos.
Declaracin de Entidades
La declaracin del tipo de documento DOCTYPE
Ejercicios

3.1. Declaracin del DTD


Como se ha explicado anteriormente, el DTD, que es de carcter opcional forma parte del prlogo
del documento. Apareciendo justo despus de la declaracin XML. El DTD puede incluir
directamente declaraciones de etiquetado y/o hacer referencia a una entidad externa, normalmente
un archivo, que contiene declaraciones de etiquetado. Adems la declaracin debe especificar cul
es el elemento raz del documento.

1 De 9

XML Lenguaje de presentacin de datos

Tema 3. DTD

<?xml versin=1.0?>
<[DOCTYPE elemento_raiz [
Las declaraciones internas van aqu
]>
<elemento_raiz></elemento_raiz>
Normalmente un DTD se utiliza para validar un gran nmero de documentos XML. La mayora de
las veces tiene poco sentido que el DTD est incluido dentro del documento XML ya que se tendra
que repetir en todos los documentos XML pertenecientes a un mismo lenguaje (DTD). Teniendo
esto en cuenta se puede distinguir entre dos tipos de referencias externas:

Un documento DTD an no publicado. Se especifica con la palabra SYSTEM seguida de la


URL con la ubicacin del documento: <!DOCTYPE elemento_raiz SYSTEM
archivo_declaraciones.dtd>

En caso de utilizar un DTD que ha sido publicado utilizaremos la palabra PUBLIC seguida
por el identificador pblico asociado a este DTD. Sigue siendo necesario incluir la URL al
fichero DTD que solo ser utilizado en caso de fallar la localizacin del fichero. Usando el
identificador pblico: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">. Que es la DTD pblica utilizada para validar
documentos XHTML estrictos. (Al fin y al cabo los documentos XHTML no son ms que
documentos HTML que utilizan DTD's para asegurar que el documento HTML es vlido).

3.2. Declaracin de tipos de elementos


Durante el proceso de diseo se identifican los distintos tipos de elementos que forman parte del
documento. En el DTD hay que incluir la declaracin de cada uno de ellos.
<!ELEMENT nombre tipo_contenido>
El nombre del elemento debe ser un nombre XML vlido. Solo podr haber una declaracin por
elemento.
Podemos tener diferentes tipos de elementos clasificados segn su contenido: vacios, que solo
contienen datos, que solo contienen elementos y mixtos.

3.2.1. Elementos vacos


Un ejemplo es la declaracin <br/> de XHTML. Se declaran especificando la palabra EMPTY.
<!ELEMENT br EMPTY>

3.2.2. Elementos que solo contienen datos


En la declaracin se especifica con #PCDATA.
<!ELEMENT first (#PCDATA)>
<!ELEMENT last (#PCDATA)>
Atendiendo a esta definicin el cdigo '<first>John</first><last>Doe</last>' sera vlido ya que
hemos utilizado los elementos 'first' y 'last' solo contienen datos (texto).
2 De 9

XML Lenguaje de presentacin de datos

Tema 3. DTD

3.2.3. Elementos que solo contienen elementos


Se distinguen dos tipos de relacin entre los elementos hijos. Secuenciales o alternativos.

Secuenciales: Imaginemos un elemento mensaje que contiene elementos hijos: remitente,


destinatario, asunto y cuerpo. La declaracin del elemento mensaje sera: <!ELEMENT
mensaje (remitente, destinatario, asunto, cuerpo)>

Alternativos: Cuando el elemento contiene uno y solo uno de los elementos hijos
especificados. Por ejemplo: <!ELEMENT persona (fsica | jurdica)>

Adems de especificar qu elementos hijos puede contener el elemento y en qu orden, se puede


establecer cuntas veces aparece cada uno de ellos mediante un carcter que, basndose en leas
expresiones regulares, indique el factor de repeticin:

El carcter *: el elemento o grupo de elementos puede repetirse 0 o ms veces.

El carcter ?: el elemento o grupo de elementos puede aparecer 0 o 1 veces.

El carcter +: el elemento o grupo de elementos puede repetirse 1 o ms veces.

Por defecto, si no ponemos nada, el elemtno debe aparecer una vez.

Ejemplo:
<!ELEMENT elem (a, (b|c)*, d+, e?>
De acuerdo a este declaracin podemos encontrarnos con los siguientes documentos vlidos:
<elem><a></a><d></d><elem>
<elem><a></a><d></d><d></d><e></e><elem>
<elem><a></a><b></b><d></d><elem>
<elem><a></a><c></c><b></b><c></c><d></d><elem>

3.2.4. Elementos mixtos


Como ya vimos en el captulo anterior este caso no suele utilizarse en XML. Se puede especificar
qu elementos hijos podrn aparecer pero sin ningn control sobre su frecuencia o si forman parte
de una secuencia de alternativa. La declaracin sera:
<!ELEMENT elem (#PCDATA|a|b|c)*>
El formato de esta declaracin es muy rgido: Siempre en primer lugar PCDATA, una lista
alternativa, no se puede aplicar caracteres de repeticin a los elementos hijos y debe especificarse
obligatoriamente el carcter de repeticin * a todo el grupo.

3.3. Declaracin de tipos de atributos.


Al igual que ocurre con los elementos, cada uno de los distintos atributos identificados en la fase de
diseo debe declararse en el DTD. Una nica declaracin permite definir una lista de atributos
asociados a un elemento. La sintaxis es la siguiente:
<!ATTLIST elemento atrib1 atrib2 atrib3 >

3 De 9

XML Lenguaje de presentacin de datos

Tema 3. DTD

Puede haber mltiples definiciones de listas de atributos para un mismo elemento. Pero si se declara
varias veces el mismo atributo solo prevalece el primero.

3.3.1. Atributos CDATA y NMTOKEN


El tipo de atributos CDATA consiste en una cadena de caracteres. Esta cadena puede incluir
cualquier carcter a excepcin de los caracteres especiales, incluidos los espacios en blanco. Si
pretendemos limitar el tipo de caracteres que pueden aparecer como valor en el atributo, debemos
utilizar el tipo NMTOKEN. Ese solo permite que aparezcan los mismos caracteres que utilizamos
para definir elementos y atributos. Existe tambin la posibilidad de utilizar el tipo NMTOKENS,
esto indica que el atributo contendr una lista de cadenas de tipo NMTOKEN.
<!ATTLIST coche color CDATA>. La propiedad color puede tomar cualquier valor.
<!ATTLIST coche color NMTOKEN>. La propiedad color puede tomar solo valores que contengan
letras, dgitos, puntos, guiones y subrayados. Deben comenzar por letra y no pueden contener
espacios en blanco.
<ATTLIST coche color NMTOKENS>. La propiedad color ser una lista de NMTOKENS. Por
ejemplo <coche color=blanco negro gris>

3.3.2. Atributos enumerados


Se usan cuando el valor del atributo est restringido a un conjunto de valores. En la declaracin de
usa el carcter | para separar los valores.
<!ATTLIST coche color (blanco | negro | gris)>
De esta forma la propiedad color solo puede tomar los valores blanco, negro o gris. Cualquier
otro valor har que la validacin del documento XML falle.

3.3.3. Atributos ID e IDREF


Es frecuente que algunos elementos tengan algn valor que los identifica de forma unvoca. Cuando
un elemento contiene una propiedad de este tipo hay que asegurarse que esta no se repite en otro
elemento. Incluso con elementos diferentes. La sintaxis es la siguiente:
<!ATTLIST coche matricula ID>
De esta forma nos aseguramos que en todo el documento XML no habr otro elemento con un
identificador igual. El valor del atributo identificador debe seguir las mismas reglas que los
nombres de atributos y elementos.
Adems como es un identificador nico permite que otros elementos puedan hacer referencia a l.
Para ello pueden utilizar el tipo IDREF. Por tanto los valores que puede tomar un atributo IDREF
son el conjunto de identificadores que estn declarados en el documento. Tambin podemos utilizar
el tipo IDREFS que no es ms que extender la definicin de IDREF a una lista de valores.

4 De 9

XML Lenguaje de presentacin de datos

Tema 3. DTD

<!ATTLIST coche matricula ID>

<!ATTLIST multa matricula IDREF>

3.3.4. Valores por defecto para los atributos


Adems del nombre y el tipo del atributo tambin se puede especificar cmo 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 carcter 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.


Algunos casos especiales son por ejemplo los atributos de tipo ID que pueden ser opcionales u
obligatorios pero no pueden tomar valores por defecto ni ser fijos.
Ejemplos:
<!ATTLIST coche matricula ID #REQUIRED>
<!ATTLIST coche color CDATA #IMPLIED>
<!ATTLIST coche color CDATA gris>
<!ATTLIST coche marca FIXED Ford>

3.4. Declaracin de Entidades


En general entidad se refiere a un objeto usado para guardar informacin y por ello necesariamente
cada documento tiene al menos la entidad del propio documento. Permite guardar contenido que
puede ser utilizado muchas veces y poder descomponer un documento grande en subconjuntos ms
manejables.
Entidad interna. Es la ms sencilla. Consiste en abreviaturas definidas en el DTD. Por ejemplo:<!
ENTITY derechos Copyright 2002>. Al definir esta entidad, en el documento XML podemos
utilizarla escribiendo &derechos;. El parser cambiar la entidad por el valor asignado.
Entidad externa. El contenido no est dentro del DTD sino en cualquier otro sitio del sistema. Se
hace referencia a su contenido mediante una URI precedida de la palabra SYSTEM o PUBLIC
segn proceda. La sintaxis es
<!ENTITY nombre SYSTEM URI>
Por ejemplo: <!ENTITY intro SYSTEM http://ww.miservidor.com/intro.xml>
Estas entidades externas permiten descomponer grandes archivos en unidades ms pequeas.
5 De 9

XML Lenguaje de presentacin de datos

Tema 3. DTD

3.5. La declaracin del tipo de documento DOCTYPE


La declaracin es opcional y solo puede aparecer una vez dentro del documento. Debe seguir a la
declaracin XML si existe y preceder a cualquier elemento o contenido de datos. Entre la
declaracin XML y DOCTYPE solo se pueden insertar comentarios. Todo documento que deba ser
validado debe contener una declaracin DOCTYPE.
<!DOCTYPE elemento_raz origen ubicacin [subconjunto interno]>
Ejemplo de un documento XML con una declaracin DTD interna:
<?xml version="1.0"?>
<!DOCTYPE mensaje [
<!ELEMENT mensaje (para,de,titulo,cuerpo)>
<!ELEMENT para (#PCDATA)>
<!ELEMENT de (#PCDATA)>
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT cuerpo (#PCDATA)>
]>
<mensaje>
<para>Jose</para>
<de>Maria</de>
<titulo>Recordatorio</titulo>
<cuerpo>Recuerda que el sbado iremos al cine</cuerpo>
</mensaje>
Cuando este documento sea analizado por un parser primero comprobar que est bien formado,
luego comprobar que los elementos y atributos corresponden con la definicin dada en el DTD.
Para comprobar la validacin vamos a guardar el contenido del documento anterior en un
documento llamado msgdtd.xml. Y lo abriremos con la herramienta CookTop:

6 De 9

XML Lenguaje de presentacin de datos

Tema 3. DTD

Una vez abierto el documento si pulsamos sobre el botn sealado con la flecha nos debe aparecer
en la parte inferior (barra de estado) el texto the XML document is valid. Esto significa que el
documento XML es vlido. En caso contrario, imaginemos que por error introducimos dos etiquetas
<de> en el documento:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE mensaje [
<!ELEMENT mensaje (para,de,titulo,cuerpo)>
<!ATTLIST mensaje prioridad (urgente | normal | baja) #REQUIRED>
<!ELEMENT para (#PCDATA)>
<!ELEMENT de (#PCDATA)>
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT cuerpo (#PCDATA)>
]>
<mensaje prioridad="normal">
<para>Jose</para>
<de>Maria</de>
<de>Maria</de>
<titulo>Recordatorio</titulo>
<cuerpo>Recuerda que el sbado iremos al cine</cuerpo>
</mensaje>
Si ahora procedemos a comprobar la validez del documento:

CookTop nos mostrar el siguiente error, ya que en el DTD tenemos definido solo un elemento
<de>. El texto de la barra de estado cambiar a the XML Document is not valid.
La segunda manera de declarar el DTD con el que hay que validar un fichero XML, y la ms
utilizada, es separar el documento XML del DTD. Por tanto la declaracin DTD ir en un fichero y
el XML en otro fichero. Esto es muy habitual porque si hay que generar muchos documentos XML
que se validan con un mismo DTD no es prctico incluir en todos los documentos XML la
declaracin DTD. Imaginemos el ejemplo del tema anterior. Donde debemos mandar un
documento XML con informacin sobre los coches que tenemos en oferta. Adems de mandarlo
nosotros es fcil imaginar que muchos concesionarios mandan peridicamente esta informacin al
portal para que se actualice. Por tanto es lgico pensar dos cosas. La primera que no tiene sentido
mandar el DTD junto con todos los ficheros porque estamos repitiendo la misma informacin
muchas veces. La segunda el DTD deber ser comn para todos los concesionarios de forma que el
portal de ofertas entienda perfectamente cualquier XML que le mandan los concesionarios. Por
tanto lo lgico es que sea el portal quien disee el DTD con la informacin que necesita y cmo la
necesita. Los concesionarios crean los documentos XML con la estructura dada y los mandan al
portal, el cual, los valida antes de tratarlos.
7 De 9

XML Lenguaje de presentacin de datos

Tema 3. DTD

La sintaxis en este caso sera:


<!DOCTYPE oferta SYSTEM http://www.servidor.com/oferta.dtd>
De esta forma el que recibe el documento XML sabe con qu DTD debe validarlo antes de
procesarlo.
Siguiendo con el ejemplo anterior de los mensajes vamos a separar del documento anterior la
definicin DTD del documento XML. Para ello creamos los dos ficheros siguientes:
<?xml version="1.0" encoding=ISO-8859-1 ?>
<!DOCTYPE mensaje SYSTEM "mensaje.dtd">
<mensaje prioridad="normal">
<para>Jose</para>
<de>Maria</de>
<titulo>Recordatorio</titulo>
<cuerpo>Recuerda que el sbado iremos al cine</cuerpo>
</mensaje>
<!ELEMENT mensaje (para,de,titulo,cuerpo)>
<!ATTLIST mensaje prioridad (urgente | normal | baja) #REQUIRED>
<!ELEMENT para (#PCDATA)>
<!ELEMENT de (#PCDATA)>
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT cuerpo (#PCDATA)>
Al primero le podemos llamar mensaje.xml y al segundo debemos llamarle mensaje.dtd que es el
nombre utilizado en la declaracin DOCTYPE. Es importante que los dos ficheros estn en el
mismo directorio porque en la declaracin DOCTYPE hemos escrito: SYSTEM mensaje.dtd.
En caso de estar en diferente ubicacin habra que especificarla SYSTEM ../DTDS/mensaje.dtd
por ejemplo.
Si abrimos el nuevo documento con Cooktop y lo validamos obtendremos el mismo resultado
anterior:

Podemos comprobar igual que con el DTD externo a introducir algn error (como la duplicacin del
elemento <de>) y ver como Cooktop nos informa del error.
8 De 9

XML Lenguaje de presentacin de datos

Tema 3. DTD

3.6. Ejercicios
3.6.1. Libros y CD
Escribir un DTD para cada una de las soluciones dadas por el profesor a los ejercicios del tema
anterior. El de la bsqueda de libros y el del CD. Realizar las modificaciones necesarias en los
documentos XML para que se validen contra los DTD's creados.
Queda como ejercicio voluntario crear tambin los DTD de las soluciones que cada uno entreg.

3.6.2. Recetas
El fichero recetas.txt al que tenis acceso en la plataforma del curso tiene definidas una serie de
recetas de un conocido chef. Se debe crear un DTD para modelar esta informacin y crear un
documento XML con las recetas que se valide con este DTD.

9 De 9

También podría gustarte