Programmieren mit Java IIhttp://sol.cs.hm.edu/4129Inhaltsverzeichnis
3. XMLAufgaben
Aufgabe 3: SAX-Parser
Ein wesentlicher Vorteil von SAX-Parsern gegenüber DOM-Parsern ist die Möglichkeit, das Einlesen schon vor dem Ende des Dokuments abzubrechen. Die Mühe lohnt sich nicht bei kleinen Dokumenten, wirkt sich aber bei langen und möglicherweise endlosen Dokumenten deutlich aus.[71]
Ein endloses Dokument stammt nicht aus einer Datei, sondern wird beispielsweise von einem Sensor generiert, der fortlaufend XML-formatierte Messwerte über eine Netzwerkverbindung liefert.
Daten für Übungszwecke können Sie mit dem folgenden Programm erzeugen:
import static java.lang.System.*;



public class XMLFactors {

public static void main(String... args) {

int upto = Integer.parseInt(args[0]);

out.printf("<?xml version=\"1.0\"?>%n");

out.printf("<root>%n");

for(int n = 1; n < upto; n++) {

out.printf("\t<number>%n");

out.printf("\t\t<value>%d</value>%n", n);

int rest = n;

int f = 2;

while(rest > 1)

if(rest%f == 0) {

out.printf("\t\t<factor>%d</factor>%n", f);

rest /= f;

}

else

f++;

out.printf("\t</number>%n");

}

out.printf("</root>%n");

}

}

XMLFactors.java: Generiert ein einfaches, aber langes XML-Dokument.
Dieses Programm erwartet auf der Kommandozeile eine positive Zahl n und produziert dann ein XML-Dokument, das für alle natürlichen Zahlen von 1 bis n die Primfaktoren angibt:[72]
Eine komprimierte Fassung dieses Dokuments steht auf http://sol.cs.hm.edu/4129/long.xml.7z zum Download zur Verfügung.
java XMLFactors 1000000 > long.xml
Das Resultat ist ein langes XML-Dokument mit einem recht simplen Aufbau, der am Anfang der Datei auch ohne Grammatik leicht zu erkennen ist:
<?xml version="1.0"?>

<root>

<number>

<value>1</value>

</number>

<number>

<value>2</value>

<factor>2</factor>

</number>

<number>

<value>3</value>

<factor>3</factor>

</number>

<number>

<value>4</value>

<factor>2</factor>

<factor>2</factor>

</number>

Stellen Sie sich nun vor, die factor-Elemente in dieser Datei wären Messwerte, unter denen ein bestimmtes Muster gesucht wird. Schreiben Sie ein Programm SAXFactorScanner, das in dieser Datei nach dem n-ten Vorkommen eines bestimmten Primfaktors sucht und die zugehörige Zahl ausgibt. Das 10000. Vorkommen des Primfaktors 61 findet man beispielsweise in der Zahl 600057. Diese Antwort liefert das Programm:
$ java SAXFactorScanner 10000 61 < long.xml

value=600057
Dazu müssen viele Megabyte XML-Daten geparst werden. Schnell sollte dagegen der folgende Aufruf ablaufen:
$ java SAXFactorScanner 3 2 < long.xml

value=4
Ein DOM-Parser würde die Datei long.xml komplett in den Speicher holen. Das dauert einerseits eine ganze Weile. Darüber hinaus beanspruchen die Objekte, aus denen das DOM aufgebaut ist, einigen Platz auf dem Heap. Zu allem Überfluss wäre der ganze Aufwand beim zweiten Aufruf weitgehend unnötig, weil das Ergebnis schon nach ein paar Zeilen feststeht und der Löwenanteil der Eingabedatei keine Rolle mehr spielt.