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.
- Es necesario el DTD.
- 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.