Curso de XML

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;

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO