Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


20.10.1

Beispiel


Mit einem SAX-Event-Handler lassen sich bereits einfache Konverter erstellen. Das folgende Beispiel realisiert einen Event-Handler, der eine Telefonliste von XML in HTML konvertiert. Die in der folgenden DTD modellierte Telefonliste besteht aus einzelnen Einträgen für jeden Mitarbeiter, die wiederum in Name, Telefonnummer und E-Mail-Adresse unterteilt sind:
  <!ELEMENT TELEFONLISTE (MITARBEITER*)>
  <!ELEMENT MITARBEITER (NAME,EMAIL,TEL)>
  <!ELEMENT NAME (#PCDATA)>
  <!ELEMENT EMAIL (#PCDATA)>
  <!ELEMENT TEL (#PCDATA)>
Ein Exemplar dieser DTD könnte folgendermaßen aussehen:
  <TELEFONLISTE>
    <MITARBEITER>
      <NAME>Peter Meier</NAME>
      <EMAIL>meier@firma.de</EMAIL>
      <TEL>-123</TEL>
    </MITARBEITER>
    <MITARBEITER>
      <NAME>Hans Müller</NAME>
      <EMAIL>mueller@firma.de</EMAIL>
      <TEL>-345</TEL>
    </MITARBEITER>
    <MITARBEITER>
      <NAME>Otto Schmidt</NAME>
      <EMAIL>schmidt@firma.de</EMAIL>
      <TEL>-678</TEL>
    </MITARBEITER>
  </TELEFONLISTE>
Die einzelnen Einträge sollen nun in Form einer einfachen HTML-Tabelle dargestellt werden. Wie bereits im einführenden Beispiel werden die meisten Aktionen in den Methoden startElement() und endElement() implementiert, nur dass diesmal jeweils unterschieden werden muss, auf welches Element sich das Ereignis bezieht:
  public void startElement(String uri, String localName,
                           String qName, Attributes attributes) {
    if (qName.equals("MITARBEITER")) {
      out.print("<TR>");
    } else if (qName.equals("TELEFONLISTE")) {
      out.print("<H2>Telefonliste</H2>\n<TABLE BORDER=\"1\">");
    } else {
      out.print("<TD>");
    }
  }

  public void endElement(String uri, String localName, String qName) {
    if (qName.equals("MITARBEITER")) {
      out.print("</TR>");
    } else if (qName.equals("TELEFONLISTE")) {
      out.println("</TABLE>");
    }
  }

Zusätzlich werden am Anfang und am Ende des Dokuments Kopf und Fuß des HTML-Dokuments erzeugt:
  public void startDocument() throws SAXException {
    out.println("<HTML>\n<HEAD>\n"
           +"<TITLE>Telefonliste</TITLE>\n</HEAD>");
    out.println("<BODY BGCOLOR=\"#ffffff\">");
  }

  public void endDocument() throws SAXException {
    out.println("</BODY>\n</HTML>\n");
  }

Besonders zu behandeln sind Zeichendaten. XML-Dokumente können alle Unicode-Zeichen enthalten, wohingegen in HTML Sonderzeichen wie die Umlaute eine besondere Darstellung haben. Daher wird in der Methode characters() ein Filter eingesetzt. characters() ist der SAX-Event-Handler für Zeichendaten. Der Filter besteht aus der Methode unicode2HTML(), die ihrerseits von der Methode character() aufgerufen wird.
  public void characters(char[] ch, int start,
                         int length) throws SAXException {
    out.print(unicode2HTML(ch, start, length));
  }

  String unicode2HTML(char[] ch, int start, int length) {
    StringBuffer s = new StringBuffer();
    for (int i = start; i < start+length; i++) {
      switch(ch[i]) {
        case 'ä': s.append("ä"); break;
        case 'ö': s.append("ö"); break;
        case 'ü': s.append("ü"); break;
        case 'ß': s.append("ß"); break;
        case '\u00e9': s.append("é"); break;
      default: s.append(ch[i]);
      }
    }
    return s.toString();
  }

In unicode2HTML() wird der von characters() übergebene String zeichenweise kopiert. Falls ein Zeichen angetroffen wird, das ersetzt werden muss, wird ein entsprechender Ersatztext eingefügt.

Die Erzeugung des Parsers erfolgt analog zum einführenden Beispiel:
  public class HTMLConverterSAX {
  
    public static void main(String[] args)
       throws ParserConfigurationException, SAXException, IOException {
  
      SAXParserFactory factory;
      SAXParser parser;
  
      // Abruf eines Factory-Exemplars
      factory = SAXParserFactory.newInstance();
      // Erzeugung des Parsers über diese Factory
      parser = factory.newSAXParser();
      parser.parse(new File(args[0]), new HTMLConverter(System.out));
    }
Wenn dieser Konverter auf das zuvor gezeigte XML-Dokument angewendet wird, erzeugt er dieses HTML-Dokument:
  <HTML>
  <HEAD>
  <TITLE>Telefonliste</TITLE>
  </HEAD>
  <BODY BGCOLOR="#ffffff">
  <H2>Telefonliste</H2>
  <TABLE BORDER="1">
  <TR>
    <TD>Peter Meier</TD>
    <TD><A HREF="mailto:meier@firma.de">meier@firma.de</A></TD>
    <TD>-123</TD>
  </TR>
  <TR>
    <TD>Hans M&uuml;ller</TD>
    <TD><A HREF="mailto:mueller@firma.de">mueller@firma.de</A></TD>
    <TD>-345</TD>
  </TR>
  <TR>
    <TD>Otto Schmidt</TD>
    <TD><A HREF="mailto:schmidt@firma.de">schmidt@firma.de</A></TD>
    <TD>-678</TD>
  </TR>
  </TABLE>
  </BODY>
  </HTML>
Abbildung 20.11 zeigt, wie dieses Dokument im Browser angezeigt wird.

Abbildung 20.11: Darstellung des konvertierten Dokuments im Browser
Abbildung 20.11


Material zum Beispiel


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.