Componentes de un documento XML

Comenzamos explicando los comentarios, las secciones CData, los elementos y las referencias a entidades de un documento XML.

Comentarios

Los comentarios en los documentos XML empiezan por <!-- y acaban por -->.

Pueden contener cualquier cadena de texto excepto el literal --.

Pueden colocarse en cualquier parte del documento.

Ej:

   <!-- Esto es comentario <ñññññ-d#dd

Secciones CData

Le indican al parser que ignore todos los caracteres de marcas que se encuentren en el interior de esta/s sección/es. (ed, son como comentarios a lo bestia)

Son muy útiles cuando queremos (x ej. a modo de tutorial) visualizar código XML como parte del texto.

Todos los caracteres que existan entre son pasados directamente a la aplicación sin interpretación.

El único literal q no puede ser utilizado dentro de la sección es, lógicamente, el ]]>.

Ej.

         <![CDATA[    <!ENTITY amp "&"> <!-- &= ampersand -->

                         <CODIGO>

                            *p=&q->campo;

                       a=(x<y)?33:44;

                         </CODIGO>

         ]]>

Elementos

Son las etiquetas más frecuentemente utilizadas dentro de un documento XML.

Están delimitadas por los símbolos < y >, sintaxis de todos conocida, puesto q era la usada en HTML.

Si el contenido de la etiqueta es vacío (al igual q <BR> ó <IMG> en HTML), entonces se delimitan por los símbolos < y />.

Las etiquetas de apertura (las que empiezan por >) pueden incluir atributos, los cuales son pares nombre/valor al estilo color="verde". (x ej, en HTML <font color="green">).

OJO!! En XML los atributos siempre deben ir encerrados entre comillas dobles.

Ejs:

<nombre id="surname">Perez</nombre>

 <vacia color="verde"/>

Referencias a entidades

Las entidades(entity) se usan en XML básicamente como representación alternativa de los caracteres especiales (como por ejemplo las comillas dobles ó la marca de apertura en un elemento), aunque también pueden emplearse para incluir el contenido de otros documentos ó para hacer referencia a trozos de texto repetitivos.

Sintaxis: &xxx;          donde xxx es el nombre de la entidad, y , &xxx; es la manera de referirse a la entidad.

Ej: &eacute; ----> Representa al símbolo é.

Existe una referencia a entidades "especial", denominada referencia a caracteres.

Ésta se usa para representar caracteres que no pueden ser escritos desde el teclado.

No tienen un nombre de cadena (como eacute x ej) sino q su nombre es, ó un nº decimal, ó un nº hexadecimal.

Ej: &#38; <!-- Ampersand -->

Tambien se pueden crear constantes (ó macros) para que no nos tengamos q acordar de los numeross.

Para ello usamos la definición "real" de entidad:

Ej:

<!ENTITY amp "&#38;"&gt;

 Para referenciarlo: &amp;

Sintaxis del XML

Tiene una sintaxis extremadamente sencilla.

Por Miguel Angel Alvarez

Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

Dicen que el XML es un 10% del SGML y de verdad lo es, porque en realidad las normas que tiene son muy simples. Se escribe en un documento de texto ASCII, igual que el HTML y en la cabecera del documento se tiene que poner el texto

<?xml version="1.0"?>

En el resto del documento se deben escribir etiquetas como las de HTML, las etiquetas que nosotros queramos, por eso el lenguaje se llama XML, lenguaje de etiquetas extendido. Las etiquetas se escriben anidas, unas dentro de otras.

<ETIQ1>...<ETIQ2>...</ETIQ2>...</ETIQ1>

Cualquier etiqueta puede tener atributos. Le podemos poner los atributos que queramos.

<ETIQ atributo1="valor1" atributo2="valor2"...>

Los comentarios de XML se escriben igual que los de HTML.

<!-- Comentario -->

Y esto es todo lo que es el lenguaje XML en si, aunque tenemos que tener en cuenta que el XML tiene muchos otros lenguajes y tecnologías trabajando alrededor de él. Sin embargo, no cabe duda que la sintaxis XML es realmente reducida y sencilla.

Para definir qué etiquetas y atributos debemos utilizar al escribir en XML tenemos que fijarnos en la manera de guardar la información de una forma estructurada y ordenada. Por ejemplo, si deseamos guardar la información relacionada con una película en un documento XML podríamos utilizar un esquema con las siguientes etiquetas.

<?xml version="1.0"?>

<PELICULA nombre="El Padrino" año=1985>

<PERSONAL>

</DIRECTOR nombre="Georgie Lucar">

</INTERPRETE nombre="Marlon Brando" interpreta-a="Don Corleone">

</INTERPRETE nombre="Al Pacino" interpreta-a="Michael Corleone">

</PERSONAL>

</ARGUMENTO descripción="Pelicula de mafias sicilianas en Estados Unidos">

</PELICULA>

Como podéis ver, nos hemos inventado las etiquetas que nos venían en gana para poner este ejemplo y las hemos anidado de manera que la etiqueta más grande es la PELICULA y dentro de ella tenemos el PRESONAL y el ARGUMENTO. A su vez, dentro de PERSONAL tenemos tanto al DIRECTOR como a los actores (INTERPRETE).

Declaraciones de tipo de documento (DTD's)

Por Javier M Criado

Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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.

Nota: Como me enseñaron en la universidad, "no es plan" que hagas una aplicación que sólo entiendas tú, de forma que, si se quiere modificar, la empresa tenga que pedirte de rodillas que lo hagas.

Para resolver estos problemas, proporcionando un pequeño estandar acerca de la sintaxis a utilizar, XML ofrece dos posibles soluciones:

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ón (Notation Declarations).

Las trataré una a una en los siguientes apartados.

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).

Nota: Luego podemos hacer una redefinición de los subelementos si queremos.

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:

Declaraciones de listas de atributos

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

Nota: El valor para los atributos acabados en S (ej. IDEREFS) será una lista de valores separados por espacios en blanco.

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

EJ:

<!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.