Programación en castellano
Inicio > Tutoriales > Internet > XML > SVG y VML > Curso de XML
-Tutoriales

Curso de XML


DTD. Entidades

Hasta el momento hemos asociado un documento XML con un único fichero, pero esto no tiene porque ser así. El XML nos permite organizar el contenido de un documento XML de forma mucho más flexible. Por ejemplo,si tenemos un libro en formato XML éste no tiene porque incluirse en un único fichero;si queremos, cada capítulo puede estar en un fichero.

Lo que permite esta flexibilidad se denomina entidad. Una entidad es una unidad de almacenamiento que puede contener cualquier cosa: desde una cadena de caracteres hasta un fichero,un gráfico,y que,por tanto,nos permite dividir el documento XML en varios objetos de almacenamiento.Después la aplicación XML que tenga que trabajar con ese documento XML tratará ese conjunto de objetos como un único objeto XML.

Las ventajas que las entidades nos proporcionan son evidentes:

  • Facilita la creación y el mantenimiento de documentos XML, al permitirnos trabajar sobre partes de éstos.
  • Permite que varias personas trabajen sobre diferentes partes de un documento XML.
  • Reusabilidad. Estas entidades pueden ser utilizadas en otros documentos XML.
  • etc.

. Declaración de una entidad

Todas las declaraciones de entidades,independientemente del tipo que sean, utilizan la misma sintaxis:

<!ENTITY nombre "contenido">

donde nombre es el identificador de la entidad y el contenido es su contenido o una referencia a éste.

. Tipos de entidades

Debido a que las entidades XML pueden hacer tantas cosas, existen muchas variedades de entidades. Esto no significa que existan siete u ocho tipos diferentes con nombre sencillos.

Existen tres propiedades que definen el tipo:

  • Dependiendo de si la entidad debe ser analizada o no por el parser, una entidad se puede clasificar como analizada o no analizada.
  • Dependiendo de si el contenido de la entidad es interno o externo es decir de si su contenido aparece en la declaración o no, la entidad se puede clasificar como interna o externa.
  • Dependiendo de si se utiliza en la DTD o en el documento se clasifica como paramétrica o general.

Pero las entidades pueden pertenecer a varios de estos tipos y, por ejemplo, tener una entidad general interna analizada. Las posiblidades de combinación son, por tanto ocho, pero tres de ellas imposibles, por lo que el número de entidades posible es cinco .

  • Entidad general interna analizada.
  • Entidad general externa analizada.
  • Entidad general externa no analizada.
  • Entidad parámetro interna.
  • Entidad parámetro externo.

En principio puede parecer un poco complicado, pero veamos cada caso por separado con algunos ejemplos concretos y vereis que en el fondo todo es muy sencillo.

. Entidad general interna analizada.

Son las más sencillas de todas y son básicamente abreviaturas totalmente definidas en la sección de declaración de tipo de documento.

En este ejemplo,

<?xml version="1.0"?>
<!DOCTYPE ejemplo [
<!ENTITY nomclub "Club de Usuarios de Internet">
]>
<ejemplo>
	En el &nomclub; realizamos cursos sobre Internet.
</ejemplo>

declaramos la entidad nomclub en la línea:

<!ENTITY nomclub "Club de Usuarios de Internet">

y luego la utilizamos colocando el nombre de la entidad entre los símbolos & y ;

La consecuencia de su utilización es que cuando el parser lea el documento cambiará la llamada a la entidad

&nomclub;
por su contenido.

Ejemplo de entidad general interna

Esta entidad es:

  • General al ser definida en un documento XML.
  • Interna al aparecer su contenido en la declaración.

Este tipo de entidades es muy utilizado también cuando es necesario emplear algún carácter que el juego de caracteres que hemos definido en el atributo encoding de la declaración XML no soporta. Por ejemplo, si quisiéramos colocar el símbolo del copyright © podriamos hacerlo de la siguiente mamera:

<?xml version="1.0"?>
<!DOCTYPE ejemplo [
<!ENTITY copy "&#169;">
]>
<ejemplo>
	&copy; Ciberaula.
</ejemplo>

. Entidad general externa analizada

En este caso la declaración no lleva implícito el contenido de la entidad. Lleva un identificador externo que indicará a la aplicación XML dónde se encuentra el contenido de la entidad.

Este identificador externo es la palabra SYSTEM seguida de la dirección (URI) donde se encuentra el recurso.

<?xml version="1.0"?>
<!DOCTYPE libro [
<!ENTITY capitulo1 SYSTEM "capitulo1.xml">
]>
<libro>
	&capitulo1;
</libro>

En este ejemplo, si el contenido del documento capitulo1.xml es:

<?xml version="1.0"?>
<capitulo>
	<para>Este es el primer capitulo</para>
</capitulo>

el resultado es:

Ejemplo de entidad general externa.

Las posibilidades de esta forma de trabajar son enormes, ya que:

  • Esta misma entidad podría ser utilizada desde múltiples documentos XML.
  • Permite que diferentes autores desarrollen diferentes partes de un documento XML de forma independiente,no teniéndose que preocupar del conjunto del documento XML.

. Ejercicio: Reescritura de XML

Volver a escribir el XML de bookmarks,de manera que cada dirección sea una entidad externa.

Ejercicio:

Tenemos que definir cada direccion en un fichero XML y luego en la declaración XML indicar dónde se encuentran estos ficheros.

En el ejemplo sobre direcciones de WML y WAP, el fichero XML quedaría de la siguiente manera:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE bookmark SYSTEM "bookmark.dtd" [

 <!-- Metainformacion -->

 <!ENTITY meta SYSTEM "wapdev_meta.xml"> 

 <!-- Direcciones -->

 <!ENTITY wapfacil SYSTEM "wapdev/wapfacil.xml">
 <!ENTITY wmlclub SYSTEM "wapdev/wmlclub.xml">
 <!ENTITY asphtml SYSTEM "wapdev/asphtml.xml">
 <!ENTITY cestacompra SYSTEM "wapdev/cestacompra.xml">
]>

<bookmark>
  
 &meta;
 <titulo>Información general sobre WAP</titulo>
 <descripcion>Recopilación de direcciones 
sobre WAP y WML.</descripcion>
 <grupo id="doc-portales">
    <titulo>Tutoriales</titulo>
    &wapfacil;
  &wmlclub;    
  </grupo>

 <grupo id="articulos">
  <titulo>Artículos</titulo>
  &asphtml;
  &cestacompra;
 </grupo>

Los nuevos ficheros XML con las direcciones han sido creados en el subdirectorio wapdev.

Fijaros que también se ha definido fuera el elemento metainfo

Hay que destacar que para el parser de XML sigue siendo una única entidad. Fijaros como el IE5 lo muestra completo.

. Entidad parámetro

Como ya hemos dicho,las entidades XML se clasifican según puedan usarse en una DTD o en el documento. Las entidades que sólo pueden utilizarse en la DTD se denominan entidades parametro.

Están diseñadas para contener listas de atributos y modelos de contenido. Nos ayudarán a organizar y agilizar la creación de las DTD, y hacerla más eficiente y consistente.

Si nos fijamos en la DTD de artículos existen,elementos con un modelo de contenido idéntico en su totalidad o parte de éste.

Por ejemplo los elementos cuerpo, seccion y seccion1

<!ELEMENT cuerpo (titulo, (para | imagen | lds | lo | codigo)* ,seccion*)>

<!ELEMENT seccion (titulo, (para | imagen | lds | lo | codigo)*, seccion1*)>
<!ATTLIST seccion
	id ID #REQUIRED>

<!ELEMENT seccion1 (titulo, (para | imagen | lds | lo | codigo)*)>

tienen en común.

(para | imagen | lds | lo | codigo)*

Lo que nos permiten las entidades paramétrícas es definir este modelo de contenido como una entidad y luego hacer referencia a ella tantas veces como sea necesario. De esta manera si necesitamos modificar estos elementos, tendremos que hacerlo sólo una vez, en un único lugar, y no tener que ir elemento por elemento realizando la modificación.

Las entidades paramétricas tienen un identificador especial en su declaración que las diferencia de las generales. Este indicador es el símbolo de tanto por ciento (%), y se usa precediendo al nombre.

<!ENTITY % nombre "contenido">

También cambia la forma de referenciarla. En lugar de colocar el nombre entre el & y ; se coloca entre % y el ;.

Por tanto, en nuestro ejemplo podemos crear la siguiente entidad paramétrica:

<!ENTITY % bloques "para | imagen | lds | lo | codigo">

y describir el modelo de contenidos de los elementos cuerpo, seccion y seccion1 de la siguiente manera:

<!ELEMENT cuerpo (titulo, (%bloques;)+ ,seccion*)>

<!ELEMENT seccion (titulo, (%bloques;)+, seccion1*)>
<!ATTLIST seccion
	id ID #REQUIRED>

<!ELEMENT seccion1 (titulo, (%bloques;)+)>

Esto también lo podemos hacer con listas de atributos. Por ejemplo, los elementos imagen y enlace tienen los mismos atributos.

<!ATTLIST imagen
	direccion CDATA #REQUIRED
   descripcion CDATA #REQUIRED>

Por tanto, podríamos definir esta lista de atributos dentro de una entidad paramétrica.

. Ejercicio: Reescribir la DTD de artículos utilizando entidades.

Reescribir la DTD de artículos redefiniendo modelos de contenidos y listas de atributos iguales como entidades paramétricas.

Solución:

Creamos una entidad bloques para declarar el modelo de contenido que se repite en los elementos cuerpo, seccion y seccion1.

<!ENTITY % bloques "para | imagen | lds | lo | codigo">

Creamos una entidad enlinea para declarar el modelo de contenido que se repite en los elementos para y il.

<!ENTITY % enlinea "enlace|destacar">

Y creamos una entidad att.elementos.enlace para declarar la lista de atributos que se repite en los elementos enlace e imagen.

<!ENTITY % att.elementos.enlace "
	direccion CDATA #REQUIRED
   descripcion CDATA #REQUIRED">

Por tanto, la declaración de estos elementos quedará de la siguiente manera:

<!ELEMENT cuerpo (titulo, (%bloques;)+ ,seccion*)>
<!ELEMENT seccion (titulo, (%bloques;)+, seccion1*)>
<!ELEMENT seccion1 (titulo, (%bloques;)+)>

<!ELEMENT para (#PCDATA|%enlinea;)*>
<!ELEMENT il (#PCDATA|%enlinea;)*>

<!ATTLIST imagen
	%att.elementos.enlace;>
<!ATTLIST enlace
	%att.elementos.enlace;>

DTD completa

Hasta el momento sólo hemos visto entidades paramétricas internas, pero también pueden ser externas.

Esto nos permitirá crear las DTD entidades que podamos utilizar en varias DTD sin necesidad de reescribirlas.

Por ejemplo, la DTD de artículos y de bookmark tienen en común el elemento metainfo. Entonces podemos definir su modelo de contenido como una entidad paramétrica externa, de manera que sólo tengamos que referenciarla desde ambas DTD en lugar de tener que declarar todo el elemento en ambas.

. Ejercicio: Definir una entidad paramétrica externa

Redefinir el elemento metainfo en la DTD de artículos y bookmark como entidad paramétrica externa.

Solución:

Creamos un archivo metainfo.dtd en el que declaramos los elementos que describen la metainformación.

<!ELEMENT metainfo (titulo, autor, pclaves?, resumen?)>

<!ELEMENT titulo (#PCDATA)>

<!ELEMENT autor (nombre, email?, url?)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT email (#PCDATA)>

<!ELEMENT pclaves (#PCDATA)>

<!ELEMENT resumen (#PCDATA)>

Y luego en la DTD de artículos y bookmark borramos las declaraciones de estos elementos y declaramos una entidad paramétrica externa de la siguiente manera:

<!ENTITY % metainfo SYSTEM "metainfo.dtd">
%metainfo;
 
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: musica mp3 | logos y melodias | hospedaje web linux | registro de dominios | servidores dedicados
más internet: comprar | recursos gratis | posicionamiento en buscadores | tienda virtual | gifs animados