UP PREVIOUS NEXT   Technologies Internet et Education, © TECFA
  4. Simple SAX

4. Simple SAX

4.1 Sensibilisation

Exemple 4-1: Simple Listing d'éléments avec SAX

A. Utilisation d'une fabrique et définition d'un handler

Parser parser = ParserFactory.makeParser( .... );

Parser parser = ParserFactory.makeParser ("org.apache.xerces.parsers.SAXParser");

// create a handler

DocumentHandler handler = new SpitElements ();

parser.setDocumentHandler(handler);

....

parser.parse(...)

B. Classes et Implémentation du callback

Exemple 4-2: SAX parsing par extension de HandlerBase

public class SpitElements extends HandlerBase {
 
    public void startElement (String name, AttributeList atts)
            throws SAXException
    {
        System.out.println("Start element: " + name);
    }
    
    public void endElement (String name) throws SAXException
    {
        System.out.println("End element: " + name);
    }
 
    public void characters(char[] charArray, int start, int length) 
   throws SAXException {
        String content = new String(charArray, start, length);
        System.out.println(" Contents: " + content); 
    }

Comme il s'agit d'un extension, on n'implémente que:

Exemple 4-3: SAX parsing par implémentation de DocumentHandler

public class SpitElements2 implements DocumentHandler {
   public void setDocumentLocator
(Locator locator) { }
   public void startDocument()
 throws SAXException {
        System.out.println("--------- START");  }
   public void endDocument()
 throws SAXException {
        System.out.println("--------- END"); 
    }
   public void startElement
 (String name, AttributeList atts)
        throws SAXException { 
        System.out.println("Start element: " + name);  }
   public void endElement
 (String name) throws SAXException {
       System.out.println("End element: " + name); }
   public void characters
(char[] charArray, int start, int length) 
       throws SAXException {
       String content = new String(charArray, start, length);
       System.out.println(" Contents: " + content); 
    }
   public void ignorableWhitespace
(char[] text, int start, int length)
       throws SAXException { // do nothing here 
   }
   public void processingInstruction(String target, String data) {}
}

4.2 Simple servlet

Exemple 4-4: Simple SaX Servlet qui liste les éléments d'un fichier (fixe)

Ce servlet est basé sur le code des exemples précédents

Seules différences notables:
  • On construit une class interne MyDocumentHandler qui implémente DocumentHandler (qu'on aurait pu mettre dans un autre fichier)
    • on n'aurait pas pu implémenter ca avec la classe du servlet (j'ai essayé)
public class FilterFormContServlet2 extends HttpServlet {
  private class MyDocumentHandler implements DocumentHandler {
  public void setDocumentLocator(Locator locator) {}
  .... }
  protected void doGet(HttpServletRequest req, HttpServletResponse res)
     throws ServletException, IOException {
  	try {
	    // create a handler
	    Parser parser = ParserFactory.makeParser (......) ;
	    DocumentHandler handler = new MyDocumentHandler ();
	    parser.setDocumentHandler(handler);
	    parser.parse(xmlURL);
    }
  • On doit gérér le PrintWriter (il doit être accessible par les méthodes de cette classe)
    • On a une variable globale: PrintWriter out;
  • On fait du HTML
    • Notez le rôle de la méthode printTail ()
public void printTail () {
  out.println("</pre>");
  out.println("</body>");
  out.println("</html>");
  out.flush();
  out.close();
}
  • Attention, ce fichier crée 2 fichiers.classe qu'il faudra copier (un pour la classe principale et un autre pour la classe interne)
FilterFormContServlet2$MyDocumentHandler.class
FilterFormContServlet2.class
FilterFormContServlet2.java

4.3 Un servlet qui traduit XML vers HTML

Exemple 4-5: Simple SaX Servlet qui liste les éléments d'un fichier (fixe)

.... mais que c'est rapide :)

public class MySaxHandler extends HandlerBase {
    
	// on ne se fatigue pas trop ici :=)
	String current;
 
	public void startElement (String name, AttributeList atts)
	   throws SAXException
	{
	   
	    if (name.equals("Title")) 
		out.println("<hr><h2>");
	    else if (name.equals("Entry")||name.equals("List")) { }
            else out.println ("<dl><dt>" + name + "<dt>");
	    current = name;
	}
 
	public void characters(char[] charArray, int start, int length) 
	    throws SAXException {
	    String content = new String(charArray, start, length);
	    if (current.equals("Title")) 
		out.println(content);
	    else out.println ("<dd>" + content + "<dd>");
	}
 
	public void endElement (String name)
	{
	    if (name.equals("Title")) 
		out.println("</h2>");
	    else if (name.equals("Entry")||name.equals("List")) { }
	    else out.println ("</dl>");
	    out.println("<!-- end" + name + "-->" );
	}
    }

UP PREVIOUS NEXT -- TIE