Ajouter des Event Handlers

Identifier la provenance d'un document (Document's Location)

Un locator est un objet qui contiens l'information nécessaire pour trouver un document. La classe Locator encapsule un system ID (URL) ou un identificateur public (URN), ou les deux. Vous pourriez avoir besoin de cette information si vous voulez trouvez des ressources relatives au document courant -- de la meme manière, qu'un navigateur gère les  href="anotherFile" dans un document HTML -- le navigateur utilise la localisation du document courant pour trouver le document anotherFile.

Vous pouvez aussi utiliser le locator pour afficher des messages d'informations. En plus de la localisation du document et de son identificateur public, le locator contient des méthodes qui retournent la colonne et la ligne du plus récent dees événements produit. La méthode setDocumentLocator est appelée une seule fois au début du parsage. Pour obtenir la ligne courante ou le numéro de colonne, il vous faut garder une référence vers le locator lorsque vous le passez à la méthode setDocumentLocator, ainsi vous pourrez y accéder dans les méthodes de traitement d'événements.

Note: Vous pouvez comme d'habitude trouver le code ici Echo04.java , et l'affichage qu'il produit là Echo04-01.log.
Rajouter la méthode ci-dessous à notre programme Echo, pour obtenir le locator et l'utiliser pour afficher le system ID du document.
 
    ...
    private String indentString = "    "; // Amount to indent
    private int indentLevel = 0;
  
    public void setDocumentLocator (Locator l)
    {
        try {
          out.write ("LOCATOR");
          out.write ("\n SYS ID: " + l.getSystemId() );
          out.flush ();
        } catch (IOException e) {
            // Ignore errors
        }
    }

    public void startDocument ()
    ...

Notes: Cette méthode contrairtement à toutes les autres méthodes de DocumentHandler, ne retourne pas de SAXException. Donc, au lieu d'utiliser  emit pour l'affichage, notre code écrit directement sur la sortie standard System.out. (Cette méthode n'est d'ailleurs généralement pas utilisée pour ce genre de choses, elle sert d'habitude à sauvegarder une référence sur l'objet Locator pour pouvoir l'utiliser plus tard).

Lorsque vous compilez et exécutez le programme sur slideSample01.xml, voici la partie significative produite :
LOCATOR
 SYS ID: file:<path>/../samples/slideSample01.xml

START DOCUMENT
<?xml version='1.0' encoding='UTF-8'?>
...
Ici, il est clair que la méthode setDocumentLocator est invoquée avant startDocument. Ceci peut etre important si vous faites des intialisations dans les méthodes de traitement des événements.

Gestion des instructions de traitement (processing instruction)

Il peut etre intéressant parfois d'inclure du code spécifique à une application dans les données XML. Dans cet exercice, nous allons ajouter une instruction de traitement à notre fichier slideSample.xml fet nous modifierons ensuite notre programme Echo pour pouvoir l'afficher.
Note: Le code de cet exemple se trouve dans Echo05.java. Le fichier sur lequel il opére est slideSample02.xml. L'affichage est rangé dans le fichier Echo05-02.log.
Le format d'une instruction de traitement est <?target data?>, ou "target" est l'application cible qui est sensée traitée l'instruction, et "data" est l'instruction ou information qu'elle doit traitée. Ajouter les lignes suivantes, qui s'adressent potentiellement à une application de présentation de slides qui demanderait à l'utilisateur qu'elle est le type d'audience :
<slideshow 
    ...
    >
    
    <!-- PROCESSING INSTRUCTION -->
    <?my.presentation.Program: QUERY="exec, tech, all"?>

    <!-- TITLE SLIDE -->
Notes: Maintenant que vous disposez d'une instruction de traitement, ajoutez le bout de code suivant à l'application :
 
public void characters (char buf [], int offset, int len)
...
}
    
public void processingInstruction (String target, String data)
throws SAXException
{
    nl(); 
    emit ("PROCESS: ");
    emit ("<?"+target+" "+data+"?>");
}

private void emit (String s)
...

Lorsque vous l'aurez fait, compilez et exécutez l'application : voici un extrait de la partie nous intéressant plus particulièrement :

...
CHARS:   
CHARS:   
PROCESS: <?my.presentation.Program: QUERY="exec, tech, all"?>
CHARS:   
CHARS:   
...
Maintenant, que vous avez la possibilité de travailler avec les intructions de traitement, vous pouvez l'enlever du fichier XML, on ne s'en servira plus (à moins que vou ne désiriez écrire l'application chargée du traitement de ces instructions ;-).