054 011 15-4437-6034
skip to the main content area of this page
XML

Valid XHTML 1.0!

 

 

Buenos Aires, Argentina.

Ultima fecha de actualización, Agosto de 2001.

 

 

Anterior      Menú Principal      Siguiente

 

Definiciones de tipo de dato, DTD:

Las DTD tienen origen en SGML, donde son obligatorias, en XML son opcionales y no son el único mecanismo de modelado de datos XML, más adelante vamos a ver XML Schema.

La idea con las DTD es proporcionar una tecnología que brinde soporte en cuanto a estructura sobre un determinado tipo de documento XML.

Las DTD son compactas pero se expresan en un lenguaje poco intuitivo y extraño, respecto de XML.

Veamos una DTD que define a nuestro documento XML agenda:

 

<!ELEMENT agenda (contacto)+>

<!ELEMENT contacto (nombre, direccion+, ciudad, provincia, codigo postal, telefono, email, web, organizacion)>

<!ELEMENT nombre (#PCDATA)>

<!ELEMENT direccion (#PCDATA)>

<!ELEMENT ciudad (#PCDATA)>

<!ELEMENT provincia (#PCDATA)>

<!ELEMENT codigo postal (#PCDATA)>

<!ELEMENT telefono (fijo, celular, fax?)>

<!ELEMENT email (#PCDATA)>

<!ELEMENT web (#PCDATA)>

<!ELEMENT organizacion (#PCDATA)>

<!ELEMENTfijo(#PCDATA)>

<!ELEMENTcelular(#PCDATA)>

<!ELEMENT fax(#PCDATA)>

 

Aunque esta DTD no muestra todas las posibilidades en un buen comienzo. Esta notación es clara, hay otra más compacta que pierde algo de claridad, pero como una de las características ventajosas de las DTD es su reducido tamaño, esta última notación maximiza su efectividad.

El signo + después de contacto indica que este puede producirse una o más veces, el signo ? después de fax indica que este puede estar ausente.

 

<!ELEMENT agenda (contacto)+>

<!ELEMENT contacto (nombre, direccion+, ciudad, provincia, codigo postal, telefono, email, web, organizacion, fijo, celular, fax)>

<!ELEMENT telefono (fijo, celular, fax?)>

<!ELEMENT nombre, direccion, ciudad, provincia, codigo postal, email, web, organización, fijo, celular, fax (#PCDATA)>

 

Esto es como agrupar por factor común, en este caso tomaremos como factor común (#PCDATA)

 

Nota:

No confundir PCDATA con CDATA que se usa para definir secciones de datos no analizados sintácticamente.

 

Los documentos pueden declararse autónomos respecto de cualquier declaración externa, como una DTD, para ello hay que declarar la instrucción de procesamiento de nuestro documento XML de la siguiente forma:

 

<?xml version="1.0" standalone="yes"?>

 

Los valores posibles de standalone son yes y no, el valor por defecto es no, por lo tanto esta declaración sólo tiene sentido con el valor yes.

 

Los nombres de los elementos no pueden contener ampersand ni empezar con ninguna combinación de caja con XML (tales como XML, xml, Xml, xMl, etc.)

Los elementos pueden ser vacios, de sólo elementos, mixtos o ANY.

 

Elementos vacíos:

Los elementos vacíos no tienen contenido pero pueden tener atributos, se declaran de la siguiente forma:

 

<!ELEMENT NombreDeElemento EMPTY>

 

por ejemplo:

 

<!ELEMENT img EMPTY>

 

este ejemplo en XML podría expresarse como

 

<img src="imagen.gif"></img>

o

<img src="imagen.gif"/>

 

Elementos de sólo elementos:

 

<!ELEMENT NombreDeElemento ModeloDeContenido>

 

Por ejemplo:

 

<!ELEMENT nota (titulo, (subtitulo | parrafo+)+, autor?, referencia*)>

 

en este ejemplo usamos todos los símbolos de declaración de elementos. El elemento nota es de sólo elemento y está seguido por su modelo de contenido formado solamente por elementos secundarios o hijos. El elemento secundario nota, debe aparecer una vez. Los elementos secundarios subtitulo y parrafo deben aparecer una vez al menos, esto está indicado por el signo + después del paréntesis de cierre, subtitulo aparecerá una sola vez y parrafo por lo menos una vez. Autor podría esta ausente o figurar un única vez. Por último referencia puede aparecer varias veces o ninguna.

 

Elementos mixtos:

Estos pueden contener caracteres y elementos secundarios. Estos se declaran de la siguiente manera:

 

<!ELEMENT NombreDeElemento (#PCDATA | ListaDeElementos)*>

 

El elemento mixto más sencillo es aquel que sólo contiene caracteres.

 

<!ELEMENT NombreDeElemento (#PCDATA)>

 

También un elemento de sólo texto es un elemento mixto sin elementos secundarios

El asterisco nos recuerda que el elemento mixto también puede ser vacío.

 

Elementos ANY:

Se declaran de la siguiente forma:

 

<!ELEMENT NombreDeElemento ANY>

 

Es un elemento sin estructura y pueden contener caracteres y elementos. Debido a su falta de estructura debe evitarse el uso de este tipo de elemento.

 

Atributos:

Estos proporcionan información adicional acerca de un elemento en la forma nombre-valor. Su sintaxis es 

 

<!ATTLIST NombreDeElemento NombreDeAtributo TipoDeAtributo Default>

 

El valor default de un atributo hace referencia a un valor que indica el uso de ese atributo. Estos valores pueden ser cuatro:

 

#REQUIRED Obligatorio.
#IMPLIED Opcional.
#FIXED Constante.
Default Valor predeterminado de atributo.

 

Los atributos suelen especificarse en una DTD debajo de la declaración de elementos, no por una exigencia de la sintaxis, sino para facilitar su comprensión.

Por otra parte hay diez tipos de atributos distintos:

 

CDATA Caracteres no analizados sintácticamente.
Enumerados Es una serie de valores de cadena.
NOTATION Notación declarada en otra parte de la DTD.
ENTITY Entidad binaria externa.
ENTITIES Múltiples entidades binarias externas.
ID Identificador único
IDREF Referencia a un ID declarado en otra parte del documento.
IDREFS Múltiples referencias a IDs declarados en otra parte del documento.
NMTOKEN Nombre compuesto por caracteres.
NMTOKENS Múltiples nombres compuestos por caracteres.

 

Los tipos de atributos pueden clasificarse en tres grupos:

 

De Cadena
Enumerados
Con símbolo

 

Atributos de cadena:

Estos son los atributos más usados y vienen presentados por el tipo CDATA que indica que el atributo contiene una simple cadena de texto.

Es importante distinguir el tipo de atributo CDATA del símbolo CDATA que se utiliza para delimitar texto no analizado sintácticamente.

Ejemplo:

 

<!ATTLIST ... Origen CDATA #REQUIRED ... >

 

En este caso el atributo Origen es obligatorio, si lo queremos opcional se debe usar de la siguiente forma

 

<!ATTLIST ...  Origen CDATA #IMPLIED ... >

 

Atributos enumerados:

Estos son atributos cuyos valores están limitados a una lista de cadenas de caracteres predefinida.

 

<!ATTLIST ...  Origen (Argentina | Uruguay | Brasil | Peru) "Argentina" ... >

 

Origen es un conjunto de cuatro valores predefinidos siendo el que se encuentra fuera de paréntesis el valor por defecto (default)

Existe un caso particular de atributo enumerado que se denomina atributo de notación. Este no se compone de una lista de cadenas de caracteres predefinidas, sino de notaciones declaradas en la DTD correspondiente, por ejemplo:

 

<!ATTLIST ...  formato de imagen NOTATION (gif | jpg) #REQUIRED ... >

 

Este atributo también podría haber sido opcional. Por lo arriba señalado los valores gif y jpg deben estar declarados en la DTD que corresponda.

 

Atributos con símbolo:

Son aquellos atributos que son procesados como símbolos por un analizador XML. Los atributos con símbolo pueden ser de los siguientes tipos:

 

ENTITY
ENTITIES
ID
IDREF
IDREFS
NMTOKEN
NMTOKENS

 

Los tipos ENTITY y ENTITIES hacen referencia a entidades, se pueden referenciar imágenes como entidades binarias.

 

<!ATTLIST  ... 3pilaresLogo ENTITY #IMPLIED ... >

 

El tipo ENTITIES es similar pero se especifica una lista de entidades separadas por espacios.

Los tipos ID, IDREF y IDREFS se relacionan con identificadores únicos. Con ID se puede identificar unívocamente a un elemento de un documento XML.

 

<!ATTLIST ...  producto id ID #REQUIRED ... >

 

Así se establece un identificador único para un elemento del tipo producto.

El tipo IDREF permite especificar una referencia a un ID. El tipo IDREFS es similar pero especifica una lista de IDs separadas por espacios en blanco.

Los tipos de atributo NMTOKEN y NMTOKENS se usan para declarar atributos con valores de símbolo con nombre. Por símbolo con nombre vamos a entender una cadena de caracteres con ciertas restricciones, no puede contener espacios en blanco, sólo pueden contener caracteres alfanuméricos y los siguientes símbolos: . - _ : (punto, guión, guión bajo y dos puntos)

Podemos declarar múltiples atributos con múltiples declaraciones individuales, pero podemos complicar la declaración de atributos con atributos múltiples.

A continuación una delaración de una DTD completa con elementos y atributos múltiples:

 

<!ELEMENT pelicula (titulo, guionista+, productor+, director+, actor*, critica?)>

<!ATTLIST pelicula tipo (drama | comedia | aventuras | ciencia ficcion | misterio | horror | romantica | documental) "drama"

clasificacion (apta para todo publico | con reservas | inconveniente para menores | xxx) "apta para todo publico"

puntuacion (1 | 2 | 3 | 4 | 5) "3"

anio CDATA #IMPLIED>

<!ELEMENT titulo (#PCDATA)>

<!ELEMENT gionista (#PCDATA)>

<!ELEMENT productor (#PCDATA)>

<!ELEMENT director (#PCDATA)>

<!ELEMENT actor (#PCDATA)>

<!ELEMENT critica (#PCDATA)>

 

Por una convención, la mayoría de las DTD se escriben comenzando por el elemento root (/) siguiendo hacia abajo, pero esto no es estricto. A continuación vemos un documento XML válido basado en la DTD arriba descripta:

 

<?xml version="1.0" standalone="no"?>

<!DOCTYPE peliculas SYSTEM "peliculas.dtd">

<peliculas>

           <pelicula tipo="comedia" clasificacion="apta para todo publico" puntuacion="1">

                       <titulo>Ayer te ví en la feria de Mataderos</titulo>

                       <guionista>Ernesto Ernst</guionista>

                       <productor>Hugo Sófocles</productor>

                       <productor>Gerardo Sófocles</productor>

                       <director>Vladislao Martiarena</director>

                       <actor>Alicio Marturana</actor>

                       <actor>Cindy Nero</actor>

                       <actor>Aldo Blar</actor>

           </pelicula>

           <pelicula tipo="comedia" clasificacion="apta para todo publico" puntuacion="1">">

                       <titulo>La Sonrisa de Mama</titulo>

                       <actor>Senador Ramon Palito Ortega</actor>

                       <actor>Libertad Lamarque</actor>

           </pelicula>

</peliculas>

 

Caracteres:

XML es lo suficientemente flexible como para soportar distintas codificaciones de caracteres. Por defecto XML codifica en estándar Unicode ISO/IEC 10646. La codificación se especifica en la declaración XML al principio del documento:

 

<?xml version="1.0" encoding="UTF-8"?>

 

Esta es la codificación más usada en XML, soporta 255 símbolos Unicode, si por alguna razón se necesita todo el conjunto de caracteres Unicode puede especificarse la codificacion UTF-16 de la suguiente manera:

 

<?xml version="1.0" encoding="UTF-16"?>

 

Pueden referenciarse símbolos que no se encuentren en el teclado con una referencia de carácter, por ejemplo el símbolo del copyrigth se referencia:

&#169;

es decir, se encierra el número Unicode correspondiente entre ampersand numeral y punto y coma, 169 es el número Unicode para referenciar al símbolo de copyrigth. Esta es una referencia decimal, también puede referenciarse en forma hexadecimal

&#xA9;

en este caso la x minúscula undica que el número que el sigue es una valor hexadecimal, en este caso el valor hexadecimal A9 equivale al decimal 169, en símbolos: xA9 = 169

Si quieren saber algo más sobre Unicode visiten http://www.unicode.org y lo lamento por ustedes.

 

Entidades

Las entidades son los bloques de información a partir de la cual se construyen documentos XML. Existen básicamente dos tipos de entidades: las analizadas sintácticamente y las no analizadas sintácticamente. Las analizadas sintácticamente contienen datos suceptibles de ser analizados por un parser XML, por lo que pueden ser de sólo texto. Las entidades no analizadas sintácticamente no las tiene en cuenta un parser XML, pueden contener texto o información binaria.

Las entidades analizadas sintácticamente se combinan con el documento que las referencia insertándose como si pertenecieran al propio documento, por lo que se la suele llamar texto de reemplazo de la entidad. Las entidades no analizadas sintácticamente nunca se combinan con el documento que las referencia.

Ahora si pensamos en las entidades no analizadas sintácticamente, ¿Cómo hace el procesador para tratarlas? En caso que sea código XML simplemente las ignora, pero cuando son datos binarios con los que se quiera hacer algo se utilizan las notaciones.

Las notaciones son construcciones XML que se usan para identificar a un tipo determinado de entidad, además las notaciones permiten especificar una aplicación de ayuda que se usa para procesar la entidad.

Las entidades analizadas sintácticamente se invocan en un documento mediante referencias a entidades, en cambio las entidades no analizadas sintácticamente se invocan como valores de atributos asignado al ENTITY o ENTITIES de un elemento.

Las entidades analizadas sintácticamente pueden ser de dos tipos:

 

Entidades generales: Se utilizan dentro del contenido de un documento.
Entidades de parámetros: Se usan sólo dentro de una DTD.

 

Entidades generales:

Las declaraciones de las entidades generales tienen esta forma:

 

<!ENTITY NombreDeEntidad DefinicionDeEntidad>

 

Una vez declarada una entidad puede ser usada en el contenido del documento anteponiéndole un ampersand y cerrándolo con un punto y coma, por ejemplo:

 

<!ENTITY nombre "Desiderio">

 

después de esta declaración se puede utilizar la entidad en una cadena de caracteres de la siguiente forma:

 

Mi nombre es &nombre;.

 

El contenido de la entidad nombre sustituirá por el texto de reemplazo que se haya definido en su declaración.

Hay un grupo de entidades generales predefinidas que pueden utilizarse en todo documento XML sin necesidad de declaración, estas son:

 

&amp;     Ampersand &
&apos;     Apóstrofe ’
&quot;     Comillas     "
&lt;         Menor que <
&gt;         Mayor que >

 

Entidades de parámetros:

Esta es un tipo de entidad general, por lo tanto analizada sintácticamente, que puede usarse sólo en el marco de una DTD y tienen la siguiente forma:

 

<!ENTITY % NombreDeEntidad DefinicionDeEntidad>

 

La idea con este tipo de declaraciones es definir una entidad de parámetros para almacenar una lista de atributos de forma que sea reutilizable.

La única diferencia con las entidades generales es la presencia del porcentual (%) en el cuerpo de la declaración.

Veamos un ejemplo:

 

<!ENTITY % dimensiones "largo, ancho, alto?">

 

Ahora en la DTD que se haya declarado puede utilizarse esta entidad de parámetros anteponiéndole un porcentual a su nombre (dimensiones) y cerrando con un punto y coma:

 

&dimensiones;

 

de la siguiente manera:

 

<!ELEMENT piso (%dimensiones;)>

<!ELEMENT pared (%dimensiones;)>

<!ELEMENT techo (%dimensiones;)>

 

Entidades externas:

Las entidades generales y las entidades de parámetros se consideran entidades internas porque el contenido de las mismas se encuentran en el mismo documento. En cambio las entidades externas hacen referencia a otros archivos.

En otras palabras una entidad externa se almacena fuera del documento en el que se declara la entidad.

Las entidades internas siempre son analizadas sintácticamente en cambio las entidades externas pueden ser o no analizadas sintácticamente.

Las entidades externas no analizadas sintácticamente se identifican por la palabra clave NDATA y pueden contener texto o datos binarios, usualmente son datos binarios.

La declaración de una entidad externa depende si el archivo que referencia la declaración se encuentra en el sistema local de archivos o se encuentra disponible en un nodo de una red. En caso que se encuentre en el sistema local de archivos o en una red se usa la palabra clave SYSTEM, si el archivo está en un nodo de una red se usa la palabra clave PUBLIC.

SYSTEM se utiliza siempre, en ambos casos, en cambio PUBLIC es opcional se especifica en el caso de un nodo de red.

El archivo de una entidad externa se especifica con una URI (Uniform Resource Identifier) que es una forma más general de URL que puede usarse para identificar recursos que no sean archivos.

 

<!ENTITY foto.jpeg SYSTEM "foto.jpg" NDATA JPEG>

 

En este ejemplo el archivo foto.jpg debe estar ubicado en la carpeta del archivo que contiene la declaración. NDATA indica que la entidad no contiene datos XML. Como XML no soporta archivos jpeg se deberá utilizar notaciones para poder trabajar con este formato. Más adelante veremos notaciones.

 

Referencias a entidades no analizadas sintácticamente:

Se debe hacer referencia a una entidad no analizada sintácticamente por medio de un atributo de tipo ENTITY o ENTITIES, por ejemplo:

 

<!ELEMENT persona EMPTY>

<!ATTLIST persona

nombre CDATA #REQUIRED

foto ENTITY #IMPLIED>

 

Esto en un documento XML puede usarse así:

 

<persona nombre="Rebeca" foto="rebeca.jpg"/>

 

Entidades de parámetros externas:

Se puede declarar una parte completa de una DTD como una entidad de parámetro externa y luego incluirla en la DTD principal.

Por ejemplo, se declara de la siguiente forma:

 

<!ENTITY % nombre SYSTEM ArchivoFisico>

 

y se referencia así:

 

%nombre;

 

Notaciones:

Es con las notaciones donde se especifica una aplicación de ayuda para poder procesar el contenido de la entidad, por ejemplo:

 

<!NOTATION nombre SYSTEM AplicacionAyuda>

 

En combinación con la declaración de entidad sería:

 

<!NOTATION GIF SYSTEM "Iexplore.exe">

<!ENTITY foto SYSTEM "foto.gif" NDATA GIF>

 

Secciones condicionales:

Las DTD brindan la posibilidad de incluir o excluir condicionalmente bloques de código, para esto se usan las palabras clave IGNORE e INCLUDE.

Veamos un caso IGNORE:

 

<![IGNORE[

<!ELEMENT titulo (#PCDATA)>

<!ELEMENT pista (#PCDATA)>

]]>

 

análogamente

INCLUDE:

 

<![INCLUDE[

<!ELEMENT titulo (#PCDATA)>

<!ELEMENT pista (#PCDATA)>

]]>

 

Estas secciones condicionales sólo estan permitidas en DTD externas (no en las internas), deben componerse por secciones de marcado completas (no son válidos los fragmentos) y no se permiten las palabras clave IGNORE e INCLUDE dentro de una declaración de marcado.

Es una buena práctica usar una entidad de parámetros como base de una sección condicional como la siguiente:

 

<!ENTITY % DEBUG "INCLUDE">

 

Si se utiliza la entidad de parámetros DEBUG para encerrar bloques de documento, con sólo modificar la entidad de parámetros de la siguiente forma:

 

<!ENTITY % DEBUG "IGNORE">

 

estos bloques de documento quedarían desactivados.

 

Herramientas:

DDbE, es una herramienta muy interesante ya que permite crear automáticamente una DTD a partir de un documento XML, es una herramienta de línea de comando, se puede bajar gratis de http://www.alphaworks.ibm.com, para su funcionamiento DDbE requiere el XML4J que puede bajarse también de http://www.alphaworks.ibm.com 

Ya tenemos un panorama bastante completo acerca de las DTDs. Podemos ver un ejemplo simple como Automoviles.xml con su archivo de definición de tipo de datos Automoviles.dtd

 

Ahora que conocen los secretos de las DTD quizá alguien piense que es una buena idea invitar a un exponente del sexo opuesto para impresionarlo/a con sus conocimientos sobre la definición de tipos de datos. Pero ojo... que pasa si les contestan: Si... pero las DTDs no son un vocabulario XML y además no podés definir tipos de dato... mejor me voy con otro/a que sepa algo de XML Schema.

mmmm.....

  

Anterior      Menú Principal      Siguiente

 

 

Carlos Marcelo Santos.

Valid XHTML 1.0!