lunes, 17 de noviembre de 2008

XML mi primer choque (II)

DJ_Bryan [blackhat4all@gmail.com]

Cuando creamos un documento DTD estamos creando nuestro propio lenguaje de marcado, que puede ser definido a nuestro antojo y con el fin que deseemos, por ejemplo, definir un estándar de comunicación entre nuestras aplicaciones, definir una tarjeta visita y quien sabe cuantas cosas más. La DTD define los tipos de elementos, atributos y entidades permitidas, y puede expresar algunas limitaciones para combinarlos.


Los documentos que se ajustan a su DTD se pueden definir como documentos validos, un DTD puede ser un fichero externo el cual puede ser usados por varios ficheros XML, o simplemente puede estar incluido en el mismo fichero XML.

Un ejemplo:
<! DOCTYPE etiqueta[
<!ELEMENT etiqueta (nombre, calle, ciudad, país, código)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT calle (#PCDATA)>
<!ELEMENT ciudad (#PCDATA)>
<!ELEMENT pais (#PCDATA)>
<!ELEMENT codigo (#PCDATA)>
]>


<nombre>Fulano Mengánez</nombre>
<calle>
c/ Mayor, 27</call>
<ciudad>
Valderredible</ciudad>
<pais>
España</pais>
<codigo>
39343</codigo>
</etiqueta>


La declaración del DTD empieza en la primera línea y termina con “]>”, en este documento se encuentra el DTD embebido dentro del fichero XML, esta puede cambiar y encontrase en cualquier otro lugar, como quedaría esto:

<?xml version="1.0"?>
<!DOCTYPE pc SYSTEM "http://www.sitio.com/dtd/pc.dtd">

<modelo>...</modelo>
...

Declarando elementos:

Los elementos son el corazón del fichero XML y estos deben ajustarse al DTD que los defina para considerar valido dicho documento.

A la hora de declarar un elemento en nuestro DTD siempre comenzamos nuestra línea con <!ELEMENT seguidas por el identificador genérico del elemento que se declara. A continuación tienen una especificación de contenido.

<!ELEMENT receta (titulo, ingredientes, procedimiento)>

En este ejemplo, el elemento <receta> puede contener dentro elementos <titulo>, <ingredientes> y <procedimiento>, que, a su vez, estarán definidos también en la DTD y podrán contener más elementos.

Siguiendo la definición de elemento anterior, este ejemplo de documento XML sería válido:

<receta>
  <titulo>...</titulo>
  <ingredientes>...</ingredientes>
  <procedimiento>...</procedimiento>
</receta>


Pero no este:

<receta>
  <parrafo>Esto es un párrafo</parrafo>
  <titulo>...</titulo>
  <ingredientes>...</ingredientes>
  <procedimiento>...</procedimiento>
</receta>


La especificación de contenido puede ser de cuatro tipos:

EMPTY

Puede no tener contenido. Suele usarse para los atributos.
<!ELEMENT salto-de-pagina EMPTY>

ANY

Puede tener cualquier contenido. No se suele usar, ya que es conveniente estructurar adecuadamente nuestros documenteo XML.
<!ELEMENT batiburrillo ANY>

Mixed

Puede tener caracteres de tipo dato o una mezcla de caracteres y sub-elementos especificados en la especificación de contenido mixto.

<!ELEMENT enfasis (#PCDATA)>
<!ELEMENT parrafo (#PCDATA|enfasis)*>


Por ejemplo, el primer elemento definido en el ejemplo (<enfasis>) puede contener datos de carácter (#PCDATA). Y el segundo (<parrafo>) puede contener tanto datos de carácter (#PCDATA) como subelementos de tipo <enfasis>.

Element

Sólo puede contener sub-elementos especificados en la especificación de contenido.
<!ELEMENT mensaje (remite, destinatario, texto)>

Para declarar que un tipo de elemento tenga contenido de elementos se especifica un modelo de contenido en lugar de una especificación de contenido mixto o una de las claves ya descritas.

Modelos de contenido:

Un modelo de contenido es en donde definimos los elementos aceptados y en el orden que deben aparecer.

Un modelo bien sencillo podría ser este, que solo soporta un elemento dentro
<!ELEMENT aviso (parrafo)>

Esto nos dice que <aviso> solo puede contener un elemento párrafo.

El uso de la coma nos permite definir el orden estricto en el cual deben aparecer los elementos.
<!ELEMENT aviso (titulo, parrafo)>

Esto nos dice que un elemento <aviso> tiene que contener un elemento <titulo> y seguido un elemento <parrafo>.
<!ELEMENT aviso (parrafo | grafico)>

Con la barra vertical nos permite representar un ó, en este caso quedaría, dentro del elemento <aviso> podemos tener un elemento <párrafo> o un elemento <grafico>.

Aquí mostramos como se pueden combinar para crear DTD mas complicados y que se adapten a nuestras necesidades.
<!ELEMENT aviso (titulo, (parrafo | grafico))>

Además, cada partícula de contenido puede llevar un indicador de frecuencia, que siguen directamente a un identificador general, una secuencia o una opción, y no pueden ir precedidos por espacios en blanco.

Indicadores de frecuencia:
? - opcional (0 o 1 ves)
* - Opcional y repetible (0 o más veces)
+ - necesario y repetible (1 o mas veces)

Para entender esto, vemos este ejemplo:

<!ELEMENT aviso (titulo?, (parrafo+, grafico)*)>

En este caso, <aviso> puede tener <titulo> o no (pero sólo uno), y puede tener cero o más conjuntos <parrafo><grafico>, <parrafo><parrafo><grafico>, etc.


Artículos relacionados


No hay comentarios: