// pakiety tworzy się od nazw domenowych, by były unikalne na świecie package pl.edu.mimuw.xmllab; // importuję klasy SAX, muszą być zawarte w JARach, które sa wymienione // w zmiennej CLASSPATH (tu ustawianej przez Anta) import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.XMLReaderFactory; import java.io.*; /** * Demonstracja SAXa. * * @author Karol Bieńkowski (kab@empolis.pl) */ public class SimpleSAX { /** * Funkcja wołana przez wirtualną maszynę, gdy uruchamiamy klasę. * To funkcja klasowa (związana z klasą, a nie z instancją, tzn. * nie można w niej używac atrybutów klasy). Funkcja jako argument * dostaje tablicę parametrów (prawie jak w C++). * * @param args Lista argumentów */ public static void main(String[] args) { if (args.length < 1) { System.err.println("Pierwszy argument to nazwa pliku (np. file:///c:/dir/file.xml)"); System.exit(0); } SimpleSAX thisClass = new SimpleSAX(); thisClass.test(args[0]); } /** * Przetwarza zadany plik wykorzystując do tego handler * zdefiniowany klasą MyHandler. * * @param fileName Plik wejściowy */ private void test(String fileName) { try { System.out.println("INPUT: "+fileName); // nazwa klasy implementującej interfejs XMLReader String xmlReaderClass = "org.apache.xerces.parsers.SAXParser"; // fabryka wczytuje implementację XMLReadera. To którą implementację // wczytać można okreslić parametrem (jak tu), lub zmienną środowiskową XMLReader reader = XMLReaderFactory.createXMLReader(xmlReaderClass); ContentHandler handler = new MyHandler(); // ustawiam mój handler, żeby konsumował zdarzenia z XMLReadera reader.setContentHandler(handler); // rozpoczynam parsowanie pliku, więc i przekazywanie zdarzeń do // handlera reader.parse(fileName); } catch (Exception e) { // łapię wszystkie wyjatki (np. SAXException, IOException) System.err.println("Error: "+e.getMessage()); e.printStackTrace(); } } /** * Prosty ContentHandler, podmienia tylko jedną metodę z * DefaultHandler. Dla zdarzenia SAXowego characters * (odpowiadającego wystąpieniu tekstu w pliku XMLowym) * wypisuje znaki na standardowe wyjście. * * @author Karol Bieńkowski (kab@empolis.pl) */ // klasa wewnętrzna private class MyHandler extends DefaultHandler { /** * Metoda zdefiniowana w interfejsie ContentHandler. Jest * wołana przez XMLReadera, gdy w parsowanym pliku XMLowym * występuje tekst. Ta implementacja characters() wypisuje * znaki na standardowe wyjście, czyli na ekran. * * @see org.xml.sax.ContentHandler.characters */ public void characters(char[] ch, int start, int length) { // zamiana tablicy znaków na string (start i length określają, // gdzie w tablicy jest interesujący nas podciąg) String str = new String(ch, start, length); // wypisanie na wyjście System.out.println("CHARACTERS: ["+str+"]"); } } }