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.

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 "©"> ]> <ejemplo> © 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:

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;>
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;