El API JAXP

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO