Xml tiene una ventaja que se puede convertir en un inconveniente: cada persona/autor puede crear sus propias etiquetas.
Esto no trae problemas si trabajamos solos; pero, ¿y si trabajamos en equipo?, ¿y si queremos exportar nuestros documentos? ¿qué estándar seguiremos?
Ej:
"A" puede escribir el nombre como sigue:
<nombre>Juan</nombre>
Sin embargo, "B" puede hacerlo así:
<nombre id="Juan"/>
Las 2 versiones son igual de correctas pero son diferentes; si extrapolamos esto a muchas marcas, entonces la lectura y/o modificación de documentos por diferentes personas puede ser un caos.
Para resolver estos problemas, proporcionando un pequeño estandar acerca de la sintaxis a utilizar, XML ofrece dos posibles soluciones:
- Las DTD's.
- Los XML Schemas.
- Declaraciones de tipo de elemento (Element Type Declarations).
- Declaraciones de listas de atributos (Attribute List Declarations).
- Declaraciones de Entidades (Entity Declarations).
- Declaraciones de notación (Notation Declarations).
Declaraciones de tipo de elemento
Estas declaraciones establecen qué elementos pueden formar parte del documento y cuáles pueden formar parte de su interior (los elementos se anidan unos dentro de otros).
Sintaxis:
Los elementos que puede contener cada elemento (valga la redundancia) van siempre encerrados entre paréntesis y precedidos de la etiqueta <!ELEMENT.
Dentro de las etiquetas, cada elemento (atributo) podrá llevar uno de los siguientes símbolos detrás de su nombre:
SÍMBOLO | SIGNIFICADO (Indica...) |
, | Secuencia de elementos |
? | 0 o 1 ocurrencias |
* | 0 o más ocurrencias |
+ | 1 o más ocurrencias |
Empty | que el elemento está vacío. Estos elementos NO tienen etiqueta de cierre. |
Any | Cualquier contenido es válido.
Yo no recomiendo su uso. |
#PCDATA | que el contenido de la cadena puede ser una cadena de texto. |
Ejs:
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT nombre EMPTY>
<!ELEMENT cliente (nombre,apellidos,nif?,tlf*,direccion+)>
Este último ej. quiere expresar lo siguiente:
El elemento cliente debe contener a nombre y apellidos, puede contener a nif y tlf - a este incluso más de una vez- y debe contener al menos una vez la dirección del cliente (para poder enviarle el pedido a casa).
EJ:
<!ELEMENT cliente (nombre,apellidos,nif?,tlf*,direccion+)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos(ape1,ape2?)>
.....
Además de esto, tambien podemos indicar que existen varias alternativas; para ello se usa el símbolo | (relación OR). Ej:
<!ELEMENT apellidos (#PCDATA|(ape1,ape2))>>
<!ELEMENT ape1 (#PCDATA)>
<!ELEMENT ape2 (#PCDATA)>
indica q se puede elejir entre teclear los 2 apellidos juntos o por separado:
- <apellidos> Perez López </apellidos>
- <apellidos> <ape1> Perez </ape1> <ape2> López </ape2> </apellidos>
Ya hemos visto como denotar los elementos que puede tener el documento. Pero, ¿qué pasa con los atributos (si es que tienen) de todos y acada uno de los elementos?
Para definirlos se usan las declaraciones de listas de atributos, cuya sintaxis es la siguiente:
Sintaxis:
Todas las definiciones de atributos empezarán por: <!ATTLIST
Cada atributo está formado por 3 partes:
Nombre
Tipo del atributo
Valor por defecto
Las posibilidades para describir el tipo de un atributo (campo) y el valor por defecto del mismo las podeis ver en las siguientes tablas:
Tipo del atributo
VALOR | SIGNIFICADO |
CDATA | El atributo será una cadena de caracteres.
No todos los caracteres son válidos. Usaremos secciones PCDATA cuando queramos incluir los carácteres no válidos. |
ID | El atributo sirve para identificar al elemento dentro del documento.
Sólo puede haber un atributo de tipo ID por elemento. |
IDREF/S | Este atributo se empleará para referenciar a otros elementos del documento a partir de su ID. |
ENTITY/S | Contiene nombres de entidades. Ver siguiente apdo. |
NMTOKEN/S | Contiene una única cadena de texto (ed, una sola palabra). |
(<<enumerados>>) | Aquí especificamos EL conjunto de valores q puede tomar el atributo; esto lo hacemos separandolos con |. |
Valores por defecto
VALOR | SIGNIFICADO |
#REQUIRED | Con esto indicamos que es obligatorio darle un valor al atributo. |
#IMPLIED | Con esto indicamos que es opcional darle un valor al atributo. |
<<valor>> | Podemos poner un valor (NO lista de valores) opcional directamente; entonces, si no se le otorga un nuevo valor posteriormente, asumirá el dado (ed, es el valor x por defecto).
No es obligatorio darle un valor en el doc. |
#FIXED <<valor>>> | Con esto obligamos a q el atributo tome necesariamente el valor especificado en <<valor>> |
<!ATTLIST cliente
numcli ID #REQUIRED
edad ("Menos de 18" | "entre 18 y 65" | "Más de 65") #IMPLIED
>
Al ser numcli de tipo ID indicamos q no puede haber 2 clientes con idéntico numcli.
Edad es un atributo no obligatorio q sólo puede tomar los valores de la lista enumerada.
Javier M Criado
Ingeniero Téc. en Informática