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?¿que estándar seguiremos?

Ej:

"A" puede escribir el nombre como sigue:
<nombre>Juan</nombre>
Sin embargo, "B" puede hacerlo as&#237;:
<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&#243;n de documentos por diferentes personas puede ser un caos. (y como me ense&#241;aron a m&#237; en la universidad, "no es plan" que hagas una aplicaci&#243;n que s&#243;lo entiendas t&#250;, de forma q si se quiere modificar, la empresa te tiene q pedir de rodillas a ti q lo hagas).

Para resolver estos problemas, proporcionando un peque&#241;o estandar acerca de la sintaxis a utilizar, xml ofrece dos posibles soluciones:
  • Las DTD's.
  • Los Xml Schemas.
En las DTD's podemos hacer 4 tipos de declaraciones:
  1. Declaraciones de tipo de elemento (Element Type Declarations).
  2. Declaraciones de listas de atributos (Attribute List Declarations).
  3. Declaraciones de Entidades (Entity Declarations).
  4. Declaraciones de notaci&#243;n (Notation Declarations).
Las tratar&#233; una a una en los siguientes apdos.

Declaraciones de tipo de elemento

Estas declaraciones establecen qu&#233; elementos pueden formar parte del documento y cuales 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&#233;ntesis y precedidos de la etiqueta <!ELEMENT.

Dentro de las etiquetas, cada elemento (atributo) podr&#225; llevar uno de los siguientes s&#237;mbolos detr&#225;s de su nombre:

S&#205;MBOLO SIGNIFICADO (Indica...) ,Secuencia de elementos ? 0 &#243; 1 ocurrencias * 0 &#243; m&#225;s ocurrencias + 1 &#243; m&#225;s ocurrencias Empty que el elemento est&#225; vac&#237;o.
Estos elementos NO tienen etiqueta de cierre. Any Cualquier contenido es v&#225;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 &#250;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&#225;s de una vez- y debe contener al menos una vez la direcci&#243;n del cliente (para poder enviarle el pedido a casa).

NOTA: Luego podemos hacer una redefinici&#243;n de los subelementos si queremos.

EJ:
<!ELEMENT cliente (nombre,apellidos,nif?,tlf*,direccion+)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos(ape1,ape2?)>
.....

Adem&#225;s de esto, tambien podemos indicar que existen varias alternativas; para ello se usa el s&#237;mbolo | (relci&#243;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 &#243; por separado:
  • <apellidos> Perez L&#243;pez </apellidos>
  • <apellidos> <ape1> Perez </ape1> <ape2> L&#243;pez </ape2> </apellidos>
Declaraciones de listas de atributos

Ya hemos visto como denotar los elementos q puede tener el documento. Pero, &#191;qu&#233; pasa con los atributos (si es q 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&#225;n por: <!ATTLIST

Cada atributo est&#225; 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 CDATAEl atributo ser&#225; una cadena de caracteres.
No todos los caracteres son v&#225;lidos.
Usaremos secciones PCDATA cuando queramos incluir los car&#225;cteres no v&#225;lidos. IDEl atributo sirve para identificar al elemento dentro del documento.
S&#243;lo puede haber un atributo de tipo ID por elemento. IDREF/SEste atributo se emplear&#225; para referenciar a otros elementos del documento a partir de su ID. ENTITY/S Contiene nombres de entidades. Ver siguiente apdo. NMTOKEN/SContiene una &#250;nica cadena de texto (ed, una s&#243;la palabra). (<<enumerados>>)Aqu&#237; especificamos EL conjunto de valores q puede tomar el atributo; esto lo hacemos separandolos con |.
NOTA: El valor para los atributos acabados en S (ej. IDEREFS) ser&#225; una lista de valores separados por espacios en blanco.

Valores por defecto

VALOR SIGNIFICADO #REQUIREDCon esto indicamos que es obligatorio darle un valor al atributo. #IMPLIEDCon 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&#225; 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>> EJ:

<!ATTLIST cliente
numcli ID #REQUIRED
edad ("Menos de 18" | "entre 18 y 65" | "M&#225;s de 65") #IMPLIED
>

Al ser numcli de tipo ID indicamos q no puede haber 2 clientes con id&#233;ntico numcli.
Edad es un atributo no obligatorio q s&#243;lo puede tomar los valores de la lista enumerada.