<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">// 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.*;
import org.xml.sax.helpers.*;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.*;


/**
 * Demonstracja SAXa.
 *
 * @author Karol Bieńkowski (http://bienkowski.net)
 */

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 &lt; 1) {
            System.err.println("Pierwszy argument to nazwa pliku (np. file:///c:/dir/file.xml)");
            System.exit(0);
        }
	System.setProperty("org.xml.sax.driver","org.apache.crimson.parser.XMLReaderImpl");
        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();

        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 (http://bienkowski.net)
     */

    // 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+"]");
        }

    }

}
</pre></body></html>