Gestionar los errores durante el parsing

2058 vistas

A nivel de documento XML existen dos tipos de errores posibles:

  • El documento puede ser no válido. En este caso, el documento no sigue la DTD o el esquema que se la ha impuesto.
  • El documento puede estar mal formado. En este caso, simplemente hay un error con relación al estándar XML mismo. Por ejemplo, las etiquetas mal cerradas o sobrepuestas

Por otro lado, a nivel del parser SAX, hay tres niveles de errores representados a nivle del Gestionador de Errores (ErrorHandler) :

  • Error faltal (fatalError(SAXParseException exception) throws SAXException): este error no se puede recuperar. Es el caso, por ejemplo, de un documento que no esté bien formado. Después de este error, el parser SAX detiene su trabajo.
  • Error (error(SAXParseException exception) throws SAXException): este error puede recuperarse, es decir, el parser SAX puede continuar con el resto de documento XML. Este error puede producirse en una violación de una restricción impuesta por el DTD o el esquema.
  • Warning (warning(SAXParseException exception) throws SAXException): es una simple advertencia. Después de ésta, el parser SAX continua con lo que quede de documento.

Para más información referente a estos errores, ver 1.0 W3C Recommendation. Por defecto, sólo se gestionarán los errores fatales.

Veamos un ejemplo de implementación de ErrorHandler. Este ejemplo detalla los errores simples y warning y eleva una SAXException en el caso de los errores fatales:



java
  1. protected String message(SAXParseException e){
  2.   String message = "Message : "+e.getMessage()+"\n";
  3.   message += "LÃnea "+e.getLineNumber()+", columna "+e.getColumnNumber()+"\n";
  4.   message += "Public id : "+e.getPublicId()+"\n";
  5.   message += "System id : "+e.getSystemId();
  6.   return message;
  7. }
  8.  
  9. protected void printSAXException(SAXParseException e){
  10.   System.out.println(message(e));
  11.   if(e.getException() != null){
  12.       e.getException().printStackTrace();
  13.   }
  14. }
  15.  
  16. public void warning(SAXParseException exception) throws SAXException{
  17.   System.out.println("*** Warning ***");
  18.   printSAXException(exception);
  19. }
  20.  
  21. public void error(SAXParseException exception) throws SAXException{
  22.   System.out.println("*** Error ***");
  23.   printSAXException(exception);
  24. }
  25.  
  26. public void fatalError(SAXParseException exception) throws SAXException{
  27.   String message = "*** Error fatal ***\n";
  28.   message += message(exception);
  29.   SAXException se = new SAXException(message, exception);
  30.   throw se;
  31. }