Efectos del DTD en el Analizador sin Validación
En la última página, definimos un tipo de documento rudimentario y lo usamos
en nuestro fichero XML. En esta página, usaremos el programa
Echo para ver como aparecen los datos en el analizador
SAX cuando se incluye un DTD.
Al ejecutar el programa Echo sobre nuestra última
versión de slideSample.xml nos muestra que muchas
de las llamadas superflúas al método characters
han desparecido.
ELEMENT: <slideshow
ATTR: ...
>
PROCESS: ...
ELEMENT: <slide
ATTR: ...
>
ELEMENT: <title>
CHARS: Wake up to ...
END_ELM: </title>
END_ELM: </slide>
ELEMENT: <slide
ATTR: ...
>
...
Es evidente que los caracteres en blanco que se usaron para formatear
los elementos slide no aparecen más, porque el DTD
declara que el slideshow sólo consta de elementos
slide.
<!ELEMENT slideshow (slide+)>
Seguir los Espacios en Blanco Ignorables
Ahora que está presente el DTD, el analizador no usa más el método
characters con los espacios en blanco que sabe que
son irrelevantes. Desde este punto la aplicación está sólo interesada
en procesar los datos XML. La aplicación nunca se preocupará de espacios
en blanco que sólo existen para hacer más leíble el fichero XML.
Por otro lado, si estuvieramos escribiendo una aplicación que filtrara
un fichero de datos XML, y quisieramos que la salida fuera igualmente
leíble, los espacios en blanco no serían irrelevantes -- serían esenciales.
Para obtener dichos caracteres, necesitamos añadir el método
ignorableWhitespace a nuestra aplicación. Lo haremos
más adelante.
Para procesar los espacios ignorables (generalmente) que el analizador está
viendo, añadimos el código en negrita de abajo para implementar el manejador
de eventos ignorableWhitespace en nuestra versión del
programa Echo.
public void characters (char buf [], int offset, int len)
...
}
public void ignorableWhitespace (char buf [], int offset, int len)
throws SAXException
{
nl(); emit("IGNORABLE");
}
public void processingInstruction (String target, String data)
Este código simplemente genera un mensaje que nos permite saber que se han
visto espacios en blanco ignorables.
Si ejecutamos la aplicación Echo ahora, la salida se
parecería a ésto.
ELEMENT: <slideshow
ATTR: ...
>
IGNORABLE
IGNORABLE
PROCESS: ...
IGNORABLE
IGNORABLE
ELEMENT: <slide
ATTR: ...
>
IGNORABLE
ELEMENT: <title>
CHARS: Wake up to ...
END_ELM: </title>
IGNORABLE
END_ELM: </slide>
IGNORABLE
IGNORABLE
ELEMENT: <slide
ATTR: ...
>
...
Aquí es evidente que el método ignorableWhitespace
está siendo invocado antes y después de los comentarios y de los elementos
Slide , donde antes era invocado
characters.
Limpieza
Ahora que hemos visto los espacios en blanco ignorables, eleminamos el código
de nuestra versión del programa Echo -- no será necesario
en ningún ejercicio más.
Documentos y Datos
Antes, aprendimos que una razón por la que habíamos oído sobre
documento XML, por un lado, y datos XML
por otro lado, es que XML maneja los dos confortablemente, dependiendo de si se
permite o no texto entre los elementos de la estructura.
En el fichero de ejemplo con el que hemos trabajado, el elemento
slideshow es un ejemplo de elemento de dato --
contiene sólo subelementos sin intervención de texto. El elemento
item, por otro lado, podría ser un elemento
documento, porque está definido para incluir tanto texto como subelementos.
Elementos Vacíos, Redefinición
Ahora que hemos entendido que ciertos ejemplares de espacios en blanco pueden
ser ignorables, es tiempo de revisar la definición de un elemento "vacío".
Esta definición pueden expandirse para incluir:
<foo> </foo>
Donde hay un espacio en blanco entre las dos etiquetas y el DTD define que el
espacio en blanco es ignorable.