Les gestionnaires d'événements SAX, EntityResolver, DTDHandler, ContentHandler et ErrorHandler, peuvent être associés à un analyseur XMLReader à l'aide des méthodes d'affectation conçue à cet effet.

XMLReader analyseur = XMLReaderFactory.createXMLReader();

ContentHandler gestContenu = new GestionnaireContenu();
analyseur.setContentHandler(gestContenu);

DTDHandler gestDTD = new GestionnaireDTD();
analyseur.setDTDHandler(gestDTD);

EntityResolver gestEntites = new GestionnaireEntites();
analyseur.setEntityResolver(gestEntites);

ErrorHandler gestErreurs = new GestionnaireErreurs();
analyseur.setErrorHandler(gestErreurs);

Comme le suggère l'exemple précédent, les gestionnaires d'événements doivent être réalisés par les soins du programmeur. Tous les gestionnaires et les méthodes nécessaires doivent être implémentés afin que l'application SAX soit en mesure de traiter les événements attendus.

import org.xml.sax.DTDHandler;

public class GestionnaireDTD implements DTDHandler {
  public void notationDecl(
                       String name, 
                       String publicId, 
                       String systemId) {
    System.out.println("DECLARATION DE NOTATION : ");
    System.out.println("Nom : " + name);
    System.out.println("ID Public : " + publicId);
    System.out.println("ID Système : " + systemId);
  }
  public void unparsedEntityDecl(
                       String name, 
                       String publicId, 
                       String systemId, 
                       String notationName) {
    System.out.println("DECLARATION D'ENTITE NON-ANALYSEE : ");
    System.out.println("Nom : " + name);
    System.out.println("ID Public : " + publicId);
    System.out.println("ID Système : " + systemId);
    System.out.println("Nom de notation : " + notationName);
  }
}

import org.xml.sax.ErrorHandler;

public class GestionnaireErreurs implements ErrorHandler {
  public void error(SAXParseException exception) {
    System.out.println("ERREUR D'ANALYSE SAX : ");
    exception.printStackTrace();
  }
  public void fatalError(SAXParseException exception) {
    System.out.println("ERREUR FATALE D'ANALYSE SAX : ");
    exception.printStackTrace();
  }
  public void warning(SAXParseException exception) {
    System.out.println("AVERTISSEMENT D'ANALYSE SAX : ");
    exception.printStackTrace();
  }
}

import org.xml.sax.EntityResolver;

public class GestionnaireEntites implements EntityResolver {
  public InputSource resolveEntity (String publicId, String systemId) {
    System.out.println("RESOLUTION D'ENTITE : ");
    System.out.println("ID Public : " + publicId);
    System.out.println("ID Système : " + systemId);
    if (systemId != null) {
      return new InputSource(systemId);
    }
    else {
      return null;
    }
  }
}

Les analyseurs SAXParser ne prennent les gestionnaires que lors de l'invocation d'une méthode d'analyse. L'assignation des gestionnaires se fait donc par l'intermédaire d'une sous-classe dérivée de la classe DefaultHandler du paquetage org.xml.sax.helpers. La classe DefaultHandler implémente les quatres interfaces EntityResolver, DTDHandler, ContentHandler et ErrorHandler.

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.IOException;

public class GestionnaireDefaut extends DefaultHandler {
    public static void main(String[] args) {
      try {
       SAXParserFactory fabrique = SAXParserFactory.newInstance();
       SAXParser analyseur = fabrique.newSAXParser();
       analyseur.parse("document.xml", new GestionnaireDefaut());
    }
    catch (ParserConfigurationException e) {
       e.printStackTrace();
    }
    catch (SAXException e) {
      e.printStackTrace();
    }
    catch (IOException e) {
       e.printStackTrace();
    }
  }
  public void characters(char[] ch, int start, int length){
    System.out.println("CONTENU TEXTUEL :\n" + new String(ch));
  } 
  public void endDocument(){
    System.out.println("FIN DOCUMENT");
  } 
  public void endElement(String uri, String localName, String qName){
    System.out.println("FIN ELEMENT (" + qName + ")");
  } 
  public void endPrefixMapping(String prefix){
    System.out.println("FIN PREFIXE ESPACE DE NOMS (" + prefix + ")");
  } 
  public void error(SAXParseException e){
    System.out.println("ERREUR D'ANALYSE SAX : ");
    e.printStackTrace();
  } 
  public void fatalError(SAXParseException e){
    System.out.println("ERREUR FATALE D'ANALYSE SAX : ");
    e.printStackTrace();
  } 
  public void ignorableWhitespace(char[] ch, int start, int length){
    System.out.println("ESPACE BLANC : ");
    System.out.println("\tChaine : '" + new String(ch) + "'");
  } 
  public void notationDecl(String name, String publicId, String systemId){
    System.out.println("DECLARATION DE NOTATION : ");
    System.out.println("\tNom : " + name);
    System.out.println("\tID Public : " + publicId);
    System.out.println("\tID Système : " + systemId);
  } 
  public void processingInstruction(String target, String data){
    System.out.println("INSTRUCTION DE TRAITEMENT : ");
    System.out.println("\tCible : " + target);
    System.out.println("\tContenu : " + data);
  } 
  public InputSource resolveEntity(String publicId, String systemId){
    System.out.println("RESOLUTION D'ENTITE : ");
    System.out.println("\tID Public : " + publicId);
    System.out.println("\tID Système : " + systemId);
    if (systemId != null) {
      return new InputSource(systemId);
    }
    else {
      return null;
    }
  }
  public void setDocumentLocator(Locator locator){
    System.out.println("LOCALISTAION : ");
    System.out.println("\tNom de classe : " + locator.getClass().getName());
    System.out.println("\tN° de colonne : " + locator.getColumnNumber());
    System.out.println("\tN° de ligne : " + locator.getLineNumber());
    System.out.println("\tID Public : " + locator.getPublicId());
    System.out.println("\tID Système : " + locator.getSystemId());
  } 
  public void skippedEntity(String name){
    System.out.println("ENTITE SAUTEE : ");
    System.out.println("\tNom : " + name);
  } 
  public void startDocument(){
    System.out.println("DEBUT DOCUMENT");
  } 
  public void startElement(
                           String uri, 
                           String localName, 
                           String qName, 
                           Attributes attributes){
    System.out.println("DEBUT ELEMENT (" + qName + ")");
    System.out.println("\tAdresse URI : " + uri);
    System.out.println("\tNom local : " + localName);
    System.out.println("\tNom qualifié : " + qName);
    System.out.println("\tAttributs : " + attributes.getLength());
    for(int i = 0; i < attributes.getLength(); i++){
      System.out.print("\t\t" + attributes.getQName(i));
      System.out.println(" = " + attributes.getValue(i));
    }
  } 
  public void startPrefixMapping(String prefix, String uri){
    System.out.println("DEBUT PREFIXE ESPACE DE NOMS : ");
    System.out.println("\tPréfixe : " + prefix);
    System.out.println("\tURI : " + uri);
  } 
  public void unparsedEntityDecl(
                                 String name, 
                                 String publicId, 
                                 String systemId, 
                                 String notationName){
    System.out.println("DECLARATION D'ENTITE NON-ANALYSEE : ");
    System.out.println("\tNom : " + name);
    System.out.println("\tID Public : " + publicId);
    System.out.println("\tID Système : " + systemId);
    System.out.println("\tNom de notation : " + notationName);
  } 
  public void warning(SAXParseException e){
    System.out.println("AVERTISSEMENT D'ANALYSE SAX : ");
    e.printStackTrace();
  } 
}