Programación en castellano
-Tutoriales

El API JAXP


Usar el Analizador con Validación

Hasta ahora, hemos realizado muchos experimentos con el analizador sin validación. Es hora de echarle un vistazo al analizador con validación y ver qué sucede cuando lo usamos para analizar la presetnación de ejemplo.

Dos cosas a enteder sobre el analizador con validación son.

  1. Es necesario el DTD.
  2. Como el DTD está presente, el método ignorableWhitespace es invocado siempre que el DTD lo haga posible.

. Configurar la Factoría

El primer paso es modificar el programa Echo para que use el analizador con validación en lugar de usar el que no tiene validación.

Nota:

El código de está sección está en Echo10.java.

Para usar el analizador con validación, hacemos los cambios en negrita que hay abajo:

public static void main (String argv [])
{
    if (argv.length != 1) {
        ...
    }
    // Use the default (non-validating) parser
    // Use the validating parser
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setValidating(true);
    try {
        ...

Aquí, hemos configurado la factoría para que producta un analizador con validación cuando se llame a newSAXParser. También podemos configurarlo para que devuelva un analizador que se preocupa el espacio de nombres usando setNamespaceAware(true). La implementación de referencia soporta cualquier combinación de opciones de configuración.

. Cambiar la Variable de Entorno

Si no se ha especificado otra clase factoría, por defecto se usa la clase SAXParserFactory. Para usar un analizador de un fabricante diferente, podemos cambiar el valor de la variable de entorno que apunta a ella. Podemos hacer esto desde la línea de comandos:

> java -Djavax.xml.parsers.SAXParserFactory=yourFactoryHere ...

El nombre de la factoría que especificamos debe ser un nombre de clase totalmente cualificado (incluyendo todo el prefijo de paquete). Para más información, puedes ver la documentación de la clase SAXParserFactory.

. Experimentar con los Errores de Validación

Para ver que sucede cuando el documento XML no especifica un DTD, eliminamos la sentencia DOCTYPE del fichero XML y ejecutamos el programa Echo sobre él.

Nota:

La salida mostrada aquí está en Echo10-01.log.

El resultado se podría parecer a esto:

<?xml version='1.0' encoding='UTF-8'?>
** Warning, line 5, uri file: ...
   Valid documents must have a <!DOCTYPE declaration.
** Parsing error, line 5, uri file: ...
   Element type "slideshow" is not declared.

Ahora que sabemos que un DTD es necesario para validar un documento. Esto tiene sentido. (Observa, que la falta de la declaración de tipo sólo genera un aviso, como se especifica en el estándard. Por otro lado, cualquier intento de analizar realmente el documento es inmediatamente gratificado con un error!).

Por eso ¿qué sucede cuando ejecutamos el analizador sobre nuestra versión actual de la presentación slide, con el DTD especificado?

Nota:

La salida mostrada aquí está en Echo10-07.log.

Esta vez, el analizador nos da el siguiente mensaje de error:

** Parsing error, line 28, uri file:...
   Element "slide" does not allow "item" here.

Este error ocurre porque la definición del elemento slide requiere un title. Este elemento no es opcional, y el slide de copyright no tiene uno. Para corregir el problema, añadimos una interrogación para hacer que el title sea un elemento opcional:

<!ELEMENT slide (image?, title?, item*)>

¿Qué sucede ahora cuando ejecutamos el programa?

Nota:

También podríamos eleminar el slide de copyright, que produce el mismo efecto, como se refleja en Echo10-06.log.

La respuesta es que todo funciona correctamente, hasta que el analizador ejecuta la etiqueta <em> contenida en el slide overview. Como esta etiqueta no está definida en el DTD, el intento de validar el documento falla. La salida se parece a esto:

...
    ELEMENT: <title>
    CHARS:   Overview
    END_ELM: </title>
    ELEMENT: <item>
    CHARS:   Why ** Parsing error, line 24, uri file:...
Element "item" does not allow "em" -- (#PCDATA|item)
org.xml.sax.SAXParseException: Element "item" does not allow "em" 
-- (#PCDATA|item)
       at com.sun.xml.parser.Parser.error(Parser.java:2798)
...

El mensaje de error identifica la parte del DTD que hizo que fallara la validación. En este caso es la línea que define un elemento item como (#PCDATA | item).

Ejercicio:

Haz una copia del fichero y elimina todas las ocurrencias de <em>. ¿Se puede validar el fichero ahora? (En la siguiente página aprenderemos como definir entradas de parámetros para poder usar XHTML en los elementos que se están definiendo como parte de la presentación de diapositivas.)

. Manejo de Errores en el Analizador con Validación

Es importante reconocer que la única razón de que se lance una excepción cuando falla la validación de un fichero es como resultado de un código de manejo de errores que introdujimos en pasos anteriores de este tutorial. Este código se reproduce aquí:

static class MyErrorHandler extends HandlerBase
{
    public void error (SAXParseException e)
    throws SAXParseException
    {
        throw e;
    }
    ...
}

Si no se lanza esta excepción, los errores de validación son simplemnete ignorados.

Ejercicio:

Intenta comentar la línea que lanza la excepción. ¿Qué sucede ahora cuando ejecutamos el analizador?

En general, un error del analizador SAX es un error de validación, aunque hemos visto que también puede generarse si el fichero especifica una versión de XML que el analizador no está preparado para manejar. Lo que hay que recordar es que nuestra aplicación no genera excepciones de validación a menos que suministremos un manejador de errores como el que hemos visto arriba.

 
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