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ü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.
Material zum Beispiel
- Quelltexte: