Programación en castellano
-Tutoriales

El API JAXP


Definir Atributos y Entidades en el DTD

El DTD que hemos definido hasta ahora esta bien para usarlo con el analizador sin validación. Dice dónde se espera el texto y dónde no, que es a todo lo que el analizador sin validación le va a prestar atención. Pero para usarlo con el analizador con validación, el DTD necesita especificar los atributos válidos para los diferentes elementos. Haremos esto en esta página, después de definir una entidad interna y una entidad externa que podamos referenciar en nuestro fichero XML.

. Definir Atributos en el DTD

Empecemos definiendo los atributos para los elementos de la presentación de diapositivas.

Nota:

El XML escrito en esta sección está en slideshow1b.dtd.

Añadimos el texto en negrita de abajo para definir los atibutos del elemento slideshow.

<!ELEMENT slideshow (slide+)>
<!ATTLIST slideshow 
            title    CDATA    #REQUIRED
            date     CDATA    #IMPLIED
            author   CDATA    "unknown"
>
<!ELEMENT slide (title, item*)>

La etiqueta DTD ATTLIST empieza la serie de definición de atributos. El nombre que sigue a ATTLIST especifica el elemento para el que se están definiendo atributos. En este caso, el elemento es slideshow.

Cada atributo está definido por una serie de tres valores separados por espacios. Las comas u otros separadores no están permitidos. El primer elemento de cada línea es el nombre del atributo: title, date, o author, en este caso. El segundo elemento indica el tipo de dato: CDATA son datos de tipo caracter -- datos sin analizar. La siguiente tabla representa las opciones válidas para el tipo de atributo.

Tipo de Atributo Especifica...
(valor1 | valor2 | ...) Una lista de valores separados por barras verticales. (ejemplo abajo)
CDATA "Datos caracter sin analizar". (Para gente normal, una cadena de texto.)
ID Un nombre que no comparte otro ID de atributo.
IDREF Una referencia a un ID definido en algún lugar del documento.
IDREFS Una lista separada por espacios que contiene una o más referencias ID.
ENTITY El nombre de una entidad definida en el DTD.
ENTITIES Una lista de entidades separada por espacios.
NMTOKEN Un nombre válido XML compuesto por letras, números, guiones, subrayados y dos puntos.
NMTOKENS Una lista de nombres separados por espacios.
NOTATION El nombre de una notación DTD especificada, que describe un formato de datos no XML, como aquellos usados para ficheros de imagenes.*

* Esta es una especificación rápidamente obsoleta que se explicará en dellate al final de esta sección.

Cuando el tipo de atributo consiste en una lista entre paréntesis de opciones separadas por una barra vertical, el atributo debe usar uno de los valores especificados. Por ejemplo, si añadimos el texto en negrita de abajo al DTD.

<!ELEMENT slide (title, item*)>
<!ATTLIST slide 
            type   (tech | exec | all) #IMPLIED
>
<!ELEMENT title (#PCDATA)>
<!ELEMENT item (#PCDATA | item)* >

Esta especificación dice que el atributo type de los elementos slide deben ser un type="tech", type="exec", o type="all". No se acepta ningún otro valor. (Los editores XML que se preocupan del DTD pueden usar dichos especificadores para presentar una lista desplegable de opciones.)

La última entrada en la especificación del atributo determina el valor por defecto, si existe, y dice si el atibuto es requerido o no. La siguiente tabla muestra las posibles opciones.

Especificación Especifica...
#REQUIRED El valor del atributo se debe especificar en el documento.
#IMPLIED El valor necesario no será especificado en el documento. Si no es así, la aplicación tendrá un valor por defecto para usarlo.
"Valor por Defecto" El valor por defecto a usar, si no se especifica un valor en el documento.
#FIXED"valorFijo" El valor a usar. Si el documento especifica un valor, debe ser el mismo.

. Definir Entidades en el DTD

Hasta ahora hemos visto entidades predefinidas como &amp; y hemos visto que un atributo puede referenciar una entidad. Es hora de aprender a definir entiades por nosotros mismos.

Nota:

El XML definido aquí está en slideSample06.xml. Y la salida está en Echo09-06.log.

Añadimos el texto en negrita de abajo a la etiqueta DOCTYPE de nuestro fichero XML:

<!DOCTYPE slideshow SYSTEM "slideshow1.dtd" [
  <!ENTITY product  "WonderWidget">
  <!ENTITY products "WonderWidgets">
]>

El nombre de etiqueta ENTITY dice que estamos definiendo una entidad. Luego viene el nombre de la entidad y su definición. En este caso, estamos definiendo una entidad llamada "product" que tomara el espacio para el nombre del producto. Más adelante cuando cambie el nombre del producto, sólo tendremos que cambiar el nombre en un lugar, y todas nuestras slides reflejarán el nuevo valor.

La última parte es la cadena de sustitución que reemplazará el nombre de la entidad siempre que sea referenciada en el documento XML. La cadena de sustitución se define entre comillas, que no se incluyen cuando el texto se inserta en el documento.

Sólo por buenas maneras, hemos definido dos versiones, una singular y otra plural, para que cuando los plurales sean irregulares podamos sustituirlos correctamente.

Ahora que tenemos las entidades definidas, el siguiente paso es referenciarlas en la aplicación. Realizamos los cambios en negrita de abajo para hacer esto.

<slideshow 
    title="WonderWidget&product; Slide Show" 
    ...    <!-- TITLE SLIDE -->
    <slide type="all">
       <title>Wake up to WonderWidgets&products;!</title>
    </slide>

    <!-- OVERVIEW -->
    <slide type="all">
      <title>Overview</title>
      <itdestacar>Why <destacar>WonderWidgets&products;</destacar> are great</itdestacar>
      <item/>
      <itdestacar>Who <destacar>buys</destacar> WonderWidgets&products;</itdestacar>
    </slide>

Los puntos a observar aquí son que las entidades que definimos son referenciadas con la misma síntaxis (&nombreEntidad;) que usamos para las entidades predefinidas, y que la entidad se puede referenciar en un valor de atributo y como contenido de un elemento.

. Mostrar las Referencias de Entidades

Cuando ejecutamos el programa Echo sobre esta versión del fichero, podemos ver esta clase de cosas:

ELEMENT: <title>
CHARS:   Wake up to 
CHARS:   WonderWidgets
CHARS:   !
END_ELM: </title>

Observamos que la existencia de referencias de entidades generan una llamada extra al método characters, y que el texto que vemos es el resultado de la sustitución.

. Entidades Útiles Adicionales

Aquí hay otros tres ejemplos de definiciones de entidades que podrían ser útiles cuando escribimos documentos XML.

<!ENTITY ldquo  "&#147;"> <!-- Left Double Quote --> 
<!ENTITY rdquo  "&#148;"> <!-- Right Double Quote -->
<!ENTITY trade  "&#153;"> <!-- Trademark Symbol (TM) -->
<!ENTITY rtrade "&#174;"> <!-- Registered Trademark (R) -->
<!ENTITY copyr  "&#169;"> <!-- Copyright Symbol --> 

. Referenciar Entidades Externas

También podemos usar identificadores SYSTEM o PUBLIC con el nombre de la entidad que está definida en un fichero externo.

Nota:

El XML definido aquí está en slideSample07.xml y en copyright.xml. La salida está en Echo09-07.log.

Para referenciar una entidad externa, añadimos el texto en negrita de abajo a la sentencia DOCTYPE de nuestro documento XML:

<!DOCTYPE slideshow SYSTEM "slideshow.dtd" [
  <!ENTITY product  "WonderWidget">
  <!ENTITY products "WonderWidgets">
  <!ENTITY copyright SYSTEM "copyright.xml">
]>

Esta definición referencia un mensaje de copyright contenido en un fichero llamado copyright.xml. Creamos el fichero, y ponemos algo interesante en él, quizás algo como esto:

<!--  A SAMPLE copyright  -->
This is the standard copyright message that our lawyers
make us put everywhere so we don't have to shell out a
million bucks every time someone spills hot coffee in their
lap...

Finalmente, añadimos el texto en negrita de abajo a nuestro fichero slideSample.xml para referenciar la entidad externa:

<!-- TITLE SLIDE -->
  ...
</slide>

<!-- COPYRIGHT SLIDE -->
<slide type="all">
   <itdestacar>&copyright;</itdestacar>
</slide>

También podríamos usar una declaración de entidad externa para acceder a un servlet que produce la fecha actual usando una definición parecida a esta:

 <!ENTITY currentDate SYSTEM
     "http://www.example.com/servlet/CurrentDate?fmt=dd-MMM-yyyy"> 

Entonces podríamos referenciar dicha entidad de la misma forma que cualquier otra:

Today's date is &currentDate;.

. Mostrar la Entidad Externa

Cuando ejecutamos el programa Echo sobre nuestra ultima versión del fichero XML, podemos ver:

        ...
        END_ELM: </slide>
        ELEMENT: <slide
           ATTR: type	"all"
        >
            ELEMENT: <itdestacar>
            CHARS:   
This is the standard copyright message that our lawyers
make us put everywhere so we don't have to shell out a
million bucks every time someone spills hot coffee in their
lap...
            END_ELM: </itdestacar>
        END_ELM: </slide>
        ...

Observa que la nueva línea que sigue al comentario en el fichero es mostrada como un caracter, pero que el propio comentario es ignorado. Esta es la razón de que el mensaje de copyright parezca empezar en la siguiente línea después de la etiqueta CHARS:, en lugar de empezar directamente después de la etiqueta -- el primer caracter mostrado es realmente la nueva línea que sigue al comentario.

. Sumarizar las Entidades

Una entidad que es referencia en el contenido del documento, tanto si es interna como externa, es conocida como entidad general. Una entidad que contiene especificaciones DTD que están referenciadas desde dentro del DTD es conocida como una entidad de parámetro.

Una entidad que contiene XML (texto y marcas), y que por lo tanto es analizada, es conocida como una entidad analizada. Una entidad que contiene datos binarios (como imágenes) es conocida como una entidad sin analizar. (Pero como es natural, debe ser externa).

 
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad
Mantenida por: Claudio y Dani.

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: jugar gratis | amor | navidad 2009 | registro de dominios | servidores dedicados
más internet: comprar | gratis | posicionamiento en buscadores | decoración libre | gifs animados