El XML no tiene elementos predefinidos. Cuando nos ponemos a escribir un documento XML, no disponemos del H1, A o del IMG del HTML. Podemos utilizar nuestros propios elementos, los cuales se definen en la DTD.
Esto lo realizamos mediante la declaraci�n ELEMENT cuya sintaxis es la siguiente:
<!ELEMENT nombre_elemento (especificacion del contenido)>
Especificaci�n del contenido
En esta parte de la declaraci�n indicamos c�al va a ser el contenido de ese elemento. Como ya hemos visto en cap�tulos anteriores tenemos cuatro posibilidades:
- Que no tenga contenido.
- Que est� formado s�lo por texto.
- Que est� formado �nicamente por elementos.
- Que tenga un contenido mixto de texto y elementos.
Sin contenido
Esto se determina colocando la palabra clave EMPTY en la declaraci�n del contenido. Son elementos que no tienen contenido y su valor suele estar determinado por los atributos. Es el caso de los elementos IMG, HR, BR, etc., del HTML.
Si a nuestro ejemplo de miniHTML queremos a�adirle la posibilidad de trabajar con im�genes, como un elemento sin contenido cuyas propiedades especificaremos en los atributos, y que �stas puedan aparecer en cualquier lugar del documento, tendremos que a�adir las siguientes declaraciones:
<!ELEMENT mihtml (c1 | parrafo | imagen)*> .... <!ELEMENT imagen EMPTY>
Luego en el XML lo tendremos que escribir de la siguiente manera:
<imagen ...atributos... />
Contenido formado s�lo por texto
Esto lo conseguimos colocando la palabra clave #PCDATA en la espeficicaci�n del contenido. De esta manera estamos indicando que dentro de ese elemento no puede haber ning�n otro elemento y que, por tanto, s�lo nos encontraremos texto. En nuestro ejemplo es el caso del elemento negrita. <!ELEMENT negrita (#PCDATA)>
Este elemento en XML se escribir�:
....<negrita>texto</negrita>.....
Contenido formado s�lo por elementos
En este caso en la especificaci�n del contenido s�lo debemos indicar los nombres (identificadores gen�ricos) de otros elementos. Posiblemente �stos est�n relacionados mediante los indicadores de aparici�n y conectores de grupo que explicamos m�s adelante.
En nuestro ejemplo es el caso del elemento mihtml en cuya declaraci�n indicamos que estar� formado por los elementos: c1, para e imagen.
<!ELEMENT mihtml (c1 | parrafo | imagen)*>
Este elemento en XML se escribir� por ejemplo:
<mihtml> <parrafo>....</parrafo> <parrafo>....</parrafo> </mihtml>
Contenido mixto
Tambi�n es posible combinar los dos �ltimos casos y declarar la especificaci�n de contenido, de manera que un elemento tenga texto y otros elementos.
En nuestro ejemplo es el caso del elemento para, que puede estar formado de texto y de elementos negrita.
<!ELEMENT parrafo (#PCDATA|negrita)*>
Como podemos observar, no tenemos m�s que combinar la palabra clave #PCDATA con los nombres de los elementos que contendra.
Este elemento en XML se escribir� por ejemplo:
<parrafo>Esto es un <negrita>parrafo</negrita></parrafo>
o
<parrafo>Esto es un parrafo</parrafo>
Posiblemente, el nombre de contenido mixto no sea el m�s adecuado, ya que como vemos en el ejemplo el modelo de contenido mixto no significa que siempre deban incluirse tanto elementos como texto.
Tambi�n es posible indicar que un elemento puede contener cualquier elemento o car�cter. Esto se consigue mediante la palabra clave ANY. Es muy poco utilizado, aunque puede ser muy �til durante el proceso de creaci�n de una DTD cuando todav�a no tenemos muy claro cu�l ser� el contenido de un elemento.
Conectores de grupo
El modelo de contenido puede contener m�s de un elemento y,por tanto, se necesita informaci�n adicional que especifica el orden en el que aparecen. Para ello utilizamos los contectores de grupo. En el XML hay dos posibles conectores de grupo:
- , indica que deben aparecer en ese orden.
- | indica que s�lo uno de los componentes puede aparecer.
Si nos fijamos en nuestro ejemplo, utilizamos esencialmente el conector | mediante el cual indicamos que el autor del documento XML puede elegir entre un elemento u otro.
Por ejemplo, en:
<!ELEMENT mihtml (c1 | parrafo | imagen)*>
estamos indicando que dentro del elemento mihtml el autor puede poner o el elemento c1, o el elemento parrafo, o el elemento imagen.
Es decir, que los siguientes ejemplos son todos v�lidos.
<mihtml> <parrafo>...</parrafo> </mihtml>
<mihtml> <c1>...</c1> </mihtml>
<mihtml> <imagen/> </mihtml>
Otro tema es el indicador ,* que nos indica que ese modelo de contenido se puede repetir y que, por tanto, esos tres elementos pueden aparecer tantas veces como quieran.
En cambio el conector "," establece una secuencia que debe seguirse. Imaginemos que en nuestro peque�o HTML queremos incluir la posibilidad de tener listas ordenadas y que �stas puedan estar ordenadas. Si al elemento lista ordenada lo identificamos mediante el elemento lo y a sus entradas "items" mediante el elemento item, su declaraci�n en la DTD quedar�a de la siguiente manera:
<!ELEMENT lo (item, (lo|item)*)> <!ELEMENT item (#PCDATA)>
Mediante el conector ,, estamos indicando que dentro de un lo en primer lugar debe haber un item y que luego puede venir otro "item" o empezar otra lista. Un texto XML que se ajuste a esta definici�n podr�a ser:
<lo> <item>Texto</item> <item>Texto</item> <lo> <item>Texto</item> <item>Texto</item> </lo> </lo>
Indicadores de aparici�n
Se utilizan para indicar cu�ntas veces puede aparecer el elemento referenciado en el modelo de contenido. Hay tres indicadores de aparici�n:
- + Indica que puede haber una o m�s apariciones del elemento.
- ? Indica que puede haber a lo m�s una o ninguna aparici�n del elemento.
- * Indica que el elemento puede estar ausente, una o m�s veces.
Como ya hemos explicado, dentro del elemento mihtm, los elementos c1, parrafo o elemento imagen pueden aparecer en el orden que quieran, pero tantas veces como quieran, o incluso ninguna. Esta �ltima caracter�stica la indicamos mediante el indicador *.
Pero imaginemos que queremos que el primer elemento de una lista ordenada no sea siempre el elemento item, sino que queremos permitir que sea lo. En tal caso podr�amos definir el elemento de la siguiente manera:
<!ELEMENT lo (item?, (lo|item)*)>
Donde con item? estamos indicando que puede aparecer 0 o 1 veces y que, por tanto, el siguiente ejemplo es v�lido.
<lo> <lo> <item>Texto</item> <item>Texto</item> </lo> </lo>
Aunque en este caso conseguir�amos el mismo efecto definiendo el elemento de la siguiente manera:
<!ELEMENT lo (lo|item)*>
�A�adiendo atributos a los elementos
Del mismo modo que los elementos, los atributos se declaran en la DTD utilizando una sintaxis bastante similar. En este caso se realiza mediante el t�rmino ATTLIST, que en el comienzo de una declaraci�n indica que es una especificaci�n de una lista de atributos.
<!ATTLIST nombre_elemento nombre_atributo tipo valor_defecto>
Como podemos observar, la primera muestra indica el elemento sobre el cual se van a definir los atributos y, a continuaci�n, viene una tripla de datos en los que indicamos:
- El nombre del atributo
- El tipo
- Y su valor por defecto.
Esta tripla se puede repetir tantas veces como queramos dentro de la declaraci�n, es decir, podemos declarar una lista de atributos, de ah� su nombre.
Un ejemplo de definici�n de atributos para nuestro elemento imagen podr�a ser:
<!ATTLIST imagen direccion CDATA #REQUIRED alineacion (izquierda, centrada, derecha) "izquierda">
Tipo
Una utilidad importante de los atributos es que mediante el tipo podemos hacer cumplir al elemento obligaciones l�xicas o sem�nticas. Las obligaciones l�xicas son por ejemplo "este atributo debe contener s�lo n�meros" y las sem�nticas son "este atributo debe contener el nombre de una entidad declarada". Evidentemente estas obligaciones son muy �tiles, ya que nos permiten garantizar la integridad de algunos de los valores de los atributos, pero la verdad es que son bastante limitadas y en muchas ocasiones insuficientes.
Los tipos de atributos pueden ser:
- CDATA
- NMTOKEN
- NMTOKENS
- ENUMERADOS
- NOTATION
- ID
- IDREF
- IDREFS
- ENTITY
- ENTITYS
En teoria las posibilidades son muchas, aunque luego en la pr�ctica sin duda alguna los m�s utilizados son los CDATA y el ID.
CDATA
Es el tipo de atributo m�s sencillo.Mediante su utilizaci�n estamos indicando que el valor del atributo debe ser de tipo car�cter. Es, por tanto, de todos los tipos el que menos obliga.
Al especificar el atributo direccion de nuestro elemento imagen:
<!ATTLIST imagen direccion CDATA #REQUIRED ...
estamos indicando que el valor del atributo direcci�n puede llevar cualquier tipo de car�cter.
ID
Mediante este tipo de atributo identificamos de forma un�voca un elemento del documento XML. Su valor debe ser �nico en el documento.
Imaginemos que queremos identificar de forma un�voca los elementos c1, de manera que luego sean f�cilmente identificables y referenciables. Esto lo tendr�amos que indicar:
<!ATTLIST c1 id ID #REQUIRED ...
IDREF
Est� estrechamente ligado al tipo de atributo ID, y mediante su utilizaci�n estamos indicando que hacemos referencia al valor de alg�n atributo ID.
NMTOKEN
Estos atributos se parecen en parte a los atributos CDATA. La principal diferencia es que s�lo aceptan lo caracteres.
ENUMERADOS
Ofrecen al usuario la posibilidad de elegir entre un n�mero reducido de valores.
Es el caso, por ejemplo, del atributo alineacion en el elemento imagen:
<!ATTLIST imagen ..... alineacion (izquierda, centrada, derecha) "izquierda">
Donde estamos indicando que los �nicos valores permitidos para el atributo alineacion son: izquierda, centrada y derecha.
Valor por defecto
La �ltima parte de la especificaci�n sirve para indicar al parser c�mo debe interpretar la ausencia de atributo.
Ya hemos visto que en este lugar podemos indicar, el valor que puede tener por defecto.
Pero en el caso de que esto no sea as�,indicamos al parser c�mo debe interpretar la ausencia de atributo con las siguientes palabras reservadas:
- #REQUIREDestamos indicando que es obligatorio colocar un valor en el atributo.
- #IMPLIED, indicamos que el valor para ese atributo es opcional, puede tener o no tener.
- #FIXED, estamos fijando el valor del atributo y el documento no ser� v�lida si a ese atributo le damos un valor diferente al especificado.