Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser XML-Parser fur kleine XML-Container Gruppe 10: Beiglböck Thomas 0726784 Fuker Wolfgang 0725381 Pichler Markus 0726556 Seite 1 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser Inhaltsverzeichnis Inhaltsverzeichnis .................................................................................................................................... 2 Aufgabenstellung..................................................................................................................................... 3 Einführung und Überblick........................................................................................................................ 4 Spezifikation der Testumgebung ............................................................................................................. 6 Ergebnisauswertung und Interpretationen ............................................................................................. 9 Fazit und Schlusswort ............................................................................................................................ 12 Anhang mit Sourcecode ........................................................................................................................ 13 Seite 2 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser Aufgabenstellung Gesucht wird ein nicht kommerzieller XML-Parser, der kleine XML-Container Dateien möglichst schnell parst. Weiters soll eine Testumgebung geschaffen werden, um einige frei erhältlichen Parser zu testen. Anschließend sollen die Testergebnisse ausgewertet werden und der schnellste XML-Parser eruiert werden. Seite 3 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser Einführung und Überblick XML bedeutet Extensible Markup Language und ist eine auszeichnende Metasprache die dazu verwendet wird, hierarchisch strukturierte Datensätze in Form von Text darzustellen. XML ist plattformunabhängig. Primär verwendet man XML, um Datensätze zwischen Computersystemen die über ein Netzwerk (LAN, WAN, Internet) verbunden sind, auszutauschen. XML ist von Computern und Menschen lesbar. Die Syntax, die Grammatik, die Struktur und die Bedeutung der zu generierenden Sprache wird mit einer DTD (Document Type Definition) oder einem XML-Schema definiert. Zusätzlich ist die Darstellung und das Layout der Informationen vom Inhalt des XML-Dokumentes getrennt. Dazu dienen sogenannte XSL-Dateien (Extensible Style Language). Ein XML-Parser “liest“ das XML-Dokument komplett durch und stellt die enthaltenen Informationen (Elemente, Attribute, usw.), zum Beispiel einer Anwendung zur Verfügung. XML-Parser können selbst geschrieben werden, wodurch man die Möglichkeit hat, auf die eigenen Wünsche konkreter einzugehen und somit den Pars-Vorgang optimieren kann oder es wird ein existierender, kommerzieller oder frei lizensierter Parser benutzt. XML-Parser Schnittstellen (SAX, DOM) sind größtenteils standardisiert. Es gibt zwei Aspekte wodurch XML-Parser klassifiziert werden: Validierende / Nicht validierende: Ein validierender Parser untersucht das zu parsende XML-Dokument ob es DTD konform und wohlgeformt (die Regeln des Standards befolgt, korrekte Schachtelung, kurz: die Regeln von XML befolgt) ist. Wenn dies zutrifft so ist es valide/gültig. Nachteil bei validierenden XML-Parsern ist, dass der Validierungsvorgang zeitaufwändig ist. Ein nicht-validierender Parser prüft nur ob das XML-Dokument wohlgeformt ist. (keine Überprüfung der DTD). Dieser sollte nur verwendet werden, wenn anderweitig garantiert werden kann, dass das zu parsende XML-Dokument valide ist. Seite 4 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser SAX (= Simple API for XML) / DOM (Document Object Model): Bei SAX Parsern (eher für Lesen und Ausgeben eingesetzt) werden Events ausgelöst, wenn ein Konstrukt (Kommentar, Processing Instruction, Fehler) eingelesen wird, und durch einen selbst programmierten Eventhandler (= eine Methode) behandelt. Das bedeutet dass die Reaktion auf das Ereignis, frei wählbar ist. Es können auch für Fehler und Warnungen entsprechende Reaktionsabläufe definiert werden. Nach dem Abarbeiten des Ereignisses ist dieses allerdings vergangen und wird nicht automatisch zwischengespeichert. Somit muss man Ergebnisse oder Werte die man eventuell später benötigt zwischenspeichern. Bei DOM Parsern (eher für interaktive Zugriffe) wird beim Parsen ein DOMTree aufgebaut, der in den Speicher geladen wird. Somit befindet sich dort ein virtuelles Abbild des XML Dokuments. Auf die Blätter des Baumes kann zugegriffen werden und sie können verändert werden. Ein DOM-Parser ist langsamer und benötigt mehr Speicherplatz als ein SAX-Parser, da das Erzeugen des DOM-Trees mehr Zeit und Ressourcen in Anspruch nimmt. Generell gilt, dass SAX-Parser schneller sind und einfacher handzuhaben, als DOM-Parser, jedoch gibt es kein persistentes Abbild im Speicher. Deswegen eignen sich SAX-Parser eher für das schnelle Einlesen und Anzeigen/Übergeben der Informationen eines XMLDokuments. DOM-Parser sollten verwendet werden, wenn man die eingelesenen Information bearbeiten/verändern will oder öfter auf das eingelesene Dokument zugegriffen wird. Seite 5 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser Spezifikation der Testumgebung Die Testumgebung verwendet Dateien, die von einer eigens erstellten Klasse erzeugt wird. Mit dieser werden Files der XML Version 1.0 erzeugt und es wird der Zeichensatz ISO-8859-1 verwendet. Das Hauptaugenmerk der Testumgebung wird auf schnelle automatisierte Verarbeitung gelegt. Die verschiedenen Texteinträge sind alle randomisiert aus den ASCIIcodierten Zeichen 97-122, welche den Kleinbuchstaben des Alphabets entsprechen. Aufgrund der randomisierten Texte muss es eine DTD geben, um die neu erzeugten Elemente zu interpretieren. Zudem wird auf Attribute verzichtet, da diese auch mit Elementen dargestellt werden. Aufgrund von Buffering und Parallelität der Prozessausführung wurden folgende Annahmen getroffen: - Jeder Parser wird in einer eigenen Klasse realisiert - Die Zeitmessung des Anfangspunktes erfolgt vor der Erzeugung der Java-Klasse. Aus Speichergründen wird der Parser neu generiert. - Die Zeitmessung des Endpunktes ist nach der Ausführung des jeweiligen parseKommandos Es werden immer mehrere Dateien mit unterschiedlichen Elementen aber gleicher Struktur getestet. Dies erfolgt aufgrund des geringen Zeitaufwandes für eine Datei. Aus diesem und dem vorher genannten Grund ergibt sich ein guter Durchschnitt für den Aufwand eines Parsers, eine Datei zu parsen, da im Realbetrieb ein Parser sicherlich nicht bei jedem neu zu parsenden File aufgerufen werden muss, jedoch der Parser nicht jedes File im Cache hat und bei mehreren gleichzeitig verwendeten Parsern muss gegebenenfalls einer erzeugt werden. Seite 6 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser Als Testparser wurden ausgewählt: - Aelfred Parser ( http://saxon.sourceforge.net/aelfred.html) - CrimsonParser2 (http://xml.apache.org/crimson/ ) - Xerces DocumentBuilderImpl (aus JDK 1.6.0) - Xerces DOMXSImplementationSourceImpl (aus dem xercesImpl.jar und dem package org.apache.xerces.dom. - DOMXSImplementationSourceImpl - Xerces Sax Parser (aus jdk1.6.0) Alle diese Parser validieren nicht und wurden ausgewählt, performancetechnischen Gründen nicht der Aufgabenstellung entsprechen. da sie aus Die Parser Aelfred und CrimsonParser2 wiesen zudem Fehler bei XML-Dateien mit DTDs auf und wurden deshalb ohne diese getestet. Testumgebung OS: Windows XP CPU: Intel Core 2 Duo E8400@ 3.00 GHz (2 CPUs) Arbeitsspeicher 3326MB Ram HD: SATA Seite 7 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser Die erhobenen Daten und die benötigten Informationen zur Auswertung werden in eine Textdatei formatiert gespeichert. Diese Diagnosedateien sehen wie folgt aus: Datei Eigenschaften: Maximale Tiefe: 3 Anzahl der Dateien: 100 Labellänge: 5 - 15 Textlänge: 20 - 30 Ebene 1, Elemente: 6 Ebene 2, Elemente: 2 Ebene 3, Elemente: 4 Durchschnittliche Dateigroeße: 1451.2399999999998 Byte Aelfred Parser: Verbrauchte Zeit = 62 Crimson Parser2: Verbrauchte Zeit = 78 XercesDocumentBuilderImpl Parser: Verbrauchte Zeit = 188 XercesDomParser Parser: Verbrauchte Zeit = 187 Xerces Sax Parser: Verbrauchte Zeit = 140 Seite 8 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser Ergebnisauswertung und Interpretationen Wie erwartet schnitten die SAX Parser, gegenüber den DOM Parser in Sachen Performanz wesentlich besser ab. Wie vorhin beschrieben, eignen sich SAX Parser dafür, Informationen schnell einzulesen. Jedoch konnte man erkennen, dass der Xerces DOM Parser, die generierten XML-Dateien, im Durchschnitt schneller geparst hat, als sein Konkurrent. Ob der Xcerces DOM Parser auch bei der weiteren Verarbeitung die besseren Ergebnisse erzielen würde, wurde nicht untersucht und es soll nicht weiter darauf eingegangen werden. Wenn man alle Testergebnisse, betrachtet und auswertet, ist gut zu erkennen, dass der Saxon Parser der schnellste Parser für kleine und wenige XML-Dateien ist. Je größer die Dateigröße und je mehr Dateien zu parsen sind, umso länger braucht der Saxon Parser dafür. Es konnten keine Abhängigkeiten von der Performanz der Parser, zu den gewählten Parametern, der maximalen Tiefe und der Label- und Textlänge, festgestellt werden. Das heißt zum Beispiel, dass sich durch ein variieren dieser Werte und Bereiche der erstellten XML-Dokumente, kein Parser besonders für Dateien einer geringen oder hohen maximalen Tiefe eignet. Die Kreisdiagramme stellen die Platzierung der Parser dar, gereiht nach der prozentualen Anzahl der erzielten Siege, im Hinblick auf die Parszeit, und unter Berücksichtigung der gesamten stichprobenartigen Testfälle. Die eigentlichen Bezeichnungen der verwendeten Parser sind hier aufgeführt, werden aber der Einfachheit halber durch ein Synonym ersetzt: Aelfred Saxon Parser = Saxon Parser Crimson Parser2 = Crimson Parser Xerces SAX Parser = Xerces SAX Parser XercesDocumentBuilderImpl Parser = DOMImpl Parser XercesDomParser Parser = Xerces DOM Parser Seite 9 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser Bei 5 XML-Dokumenten: 25% 1. Saxon 2. Crimson 75% Bei 100 XML-Dokumenten: 29% Bei 500 XML-Dokumenten: 41% 1. Saxon 71% 2. Crimson Bei 1000 XML-Dokumenten: 48% 52% 1. Saxon 59% 2. Crimson Bei 2000 XML-Dokumenten: 1. Saxon 1. Crimson 39% 2. Crimson 61% 2. Saxon Zu erkennen ist, dass der Saxon Parser bis zu 1000 XML-Dokumente am schnellsten von allen Parsern parst (Dementsprechend auch 1 Dokument). Dies beruht darauf, wie oben erklärt, an der mitgestoppten Anlegezeit des Parsers, welche durch die Größe des Parser beeinflusst wird. Bei 1000 XML-Dokumenten kann man sehen, dass der Crimson den Saxon Parser schon beinahe eingeholt hat. Bei 2000 Dokumenten schlägt der Crimson den Saxon Parser in der Parsgeschwindigkeit. Seite 10 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser Wenn man die besten Parszeiten insgesamt von jedem Parser, im Hinblick auf die durchschnittliche Dateigröße betrachtet, und entsprechend aufschlüsselt, so kann man erkennen, das anfänglich zwar der Saxon Parser triumphiert, aber mit steigenden Dateigrößen, sich der Vorsprung gegenüber dem Crimson Parser relativiert. Die folgende Aufstellung zeigt, in welchen Dateigrößenbereichen welche Parser das, im Durchschnitt, beste Ergebnis liefern, ohne Berücksichtigung der Dateianzahl. Die Auswertung wurde in Kilobyte-Schritten durchgeführt. 1 - 3 KB: Saxon Parser > 3 KB: Crimson Parser Dadurch hat sich herauskristallisiert, dass der Saxon Parser eher bei einer durchschnittlichen Dateigröße unter 3 KB sinnvoll anzuwenden sind, da sich mit anwachsender Größe die Parszeiten tendenziell verschlechtern. Ab 3 KB ist es sinnvoll den Crimson Parser zu verwenden. Die durchschnittlichen Parszeiten von jedem Parser im Hinblick auf die durchschnittliche Dateigröße, ohne Berücksichtigung der Dateianzahl, betragen: Dateien unter 2 KB Größe: Crimson Parser: Xerces SAX Parser: Saxon Parser: DOMImpl Parser: Xerces DOM Parser: 195,9 ms 237,4 ms 164,5 ms 290,6 ms 273,9 ms Dateien von 2 KB bis 4 KB Größe: Crimson Parser: Xerces SAX Parser: Saxon Parser: DOMImpl Parser: Xerces DOM Parser: 416,7 ms 454,7 ms 437,6 ms 582,5 ms 486,9 ms Dateien von 4 KB bis 8 KB Größe: Crimson Parser: Xerces SAX Parser: Saxon Parser: DOMImpl Parser: Xerces DOM Parser: 622,9 ms 762,8 ms 765,3 ms 992,8 ms 901,4 ms Seite 11 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser Fazit und Schlusswort Fazit der Untersuchungen ist, dass die zwei schnellsten Parser (Saxon und Crimson), je nach Anwendungsgebiet, gefunden wurden. Folglich gibt es keinen Parser der generell der schnellste wäre. Jedoch ist der für die Aufgabenstellung relevante schnellste Parser (Saxon) eruiert worden. Die Testergebnisse beruhen auf statistischen Stichproben und wurden anschließend interpretiert. Um dies zu bewerkstelligen wurde eine Testumgebung in Java aufgebaut, die aus mehreren Teilen besteht. Zum einen den XML-Creator und zum anderen die Einbindungen der verschiedenen zu testenden Parsern. Seite 12 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser Anhang mit Sourcecode XmlCreator.java Diese Klasse erstellt ein XML-File. Die Konfiguration wird über die Methode initialising durchgeführt, mit der es möglich ist XML-Files zu erstellen. package eemw2010; import java.io.*; import java.util.Random; import java.util.Vector; public class XMLCreator implements Config { /** * @param args * @throws IOException * @throws IOException */ private static int depth = 0; // Maximale Tiefe private static Vector<Integer> ele; // Elemente pro Ebene Vektor private static Random rand; // Randomnumbergenerator private static final int maxb = 5; // Konstante zur Begrenzung des // Eintragverdoppelungsarray private static FileWriter fdoc; // FileWriter für die DTD Datei private static int llc, // Labellengthconstant, llv, // Labellenghtvariable, dlc, // Datalengthconstant, dlv; // Datalenghtvariable /* * Erstellt ein Xml File mit aus den zuvor initialisierten Variablen (aus * der Methode initialsing) in den FileWriter */ private static void CreateXml(FileWriter fw) { String xml1; int cdepth = 0; int i = 0; Vector<Integer> used = new Vector<Integer>(); used.setSize(depth + 1); for (i = 0; i < depth + 1; i++) used.set(i, 0); try { Seite 13 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser xml1 = ranText(rand.nextInt(llv) + llc); recWrite(fw, cdepth, used, xml1); } catch (IOException e) { e.printStackTrace(); } } /* * Rekursive SchreibMethode, fw = FileWriter Schreiben in die Datei, cdepth * = aktuelle Tiefe, used = Vector zum Zählen der derzeit eingesetzten * Elemente, l = LabelString im Xml */ private static boolean recWrite(FileWriter fw, int cdepth, Vector<Integer> used, String l) throws IOException { Vector<String> docv = new Vector<String>(); // Vector zum Erstellen der // DTD String s; // String für den Zufallstext StringBuffer sb = new StringBuffer(); // StringBuffer zum Erstellen des // Strings für die DTD if (depth > cdepth) { // Tabulatoren im Xml-File erzeugen for (int i = 0; i < cdepth; i++) { fw.write(9); } fw.write("<" + l + ">\n"); fdoc.write("<!ELEMENT EEMTEST (" + l + ")>\n"); s = ranText(rand.nextInt(llv) + llc); WriteLevel(fw, s, cdepth + 1); // Einen Texteintrag erzwingen docv.add(s); // Eintrag für die DTD merken used.set(cdepth, used.get(cdepth) + 1); while (used.get(cdepth) < ele.get(cdepth)) { if (rand.nextInt(2) == 1) { s = ranText(rand.nextInt(llv) + llc); docv.add(s); recWrite(fw, cdepth + 1, used, s); } else { s = ranText(rand.nextInt(llv) + llc); docv.add(s); WriteLevel(fw, s, cdepth + 1); } used.set(cdepth, used.get(cdepth) + 1); // Elemente zählen } // Tabulatoren im Xml-File erzeugen for (int i = 0; i < cdepth; i++) { fw.write(9); } fw.write("</" + l + ">\n"); // DTD Eintrag generieren sb.append(docv.get(0)); Seite 14 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser for (int i = 1; i < docv.size(); i++) { sb.append(", "); sb.append(docv.get(i)); } fdoc.write("<!ELEMENT " + l + " (" + sb.toString() + ") >\n"); used.set(cdepth, 0); return true; } else { WriteLevel(fw, ranText(rand.nextInt(llv) + llc), cdepth + 1); used.set(cdepth, used.get(cdepth) + 1); while (used.get(cdepth) < ele.get(cdepth)) { if (rand.nextInt(2) == 0) { WriteLevel(fw, ranText(rand.nextInt(llv) + llc), cdepth + 1); } used.set(cdepth, used.get(cdepth) + 1); } used.set(cdepth, 0); return true; } } /* * Schreibt einen randomisierten Text in den FileWriter fw, label als * xml-Label, cdepth als aktuelle Tiefe */ private static void WriteLevel(FileWriter fw, String label, int cdepth) throws IOException { for (int i = 0; i < cdepth; i++) { fw.write(9); } fw.write("<" + label + ">"); fw.write(ranText(dlc + rand.nextInt(dlv))); fw.write("</" + label + ">\n"); fdoc.write("<!ELEMENT " + label + " (#PCDATA) >\n"); } // Erzeugt einen Text mit Länge l, aus den ASCII Zeichen 97- 122 (a-z) private static String ranText(int l) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < l; i++) sb.append((char) (rand.nextInt(26) + 97)); return sb.toString(); } public static void main(String[] args) throws IOException { FileWriter fw; // FileWriter für die Datei zu schreiben FileReader fr; // FileReader zum Vergrössern von Dateien unter 1kb BufferedReader br; String line = null; ele = new Vector<Integer>(); rand = new Random(); Seite 15 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser String filename2 = null; int usebuffer = 0; StringBuffer sb[] = new StringBuffer[maxb]; File datei, fdiag; long fl[] = new long[anz]; // Filegröße gesamt double erg = 0; // Filegröße ergebnis fdiag = new File(diagname); BufferedWriter diag = new BufferedWriter(new FileWriter(fdiag, true)); // Configuration: initialsing(); // Diagnosefile erstellen diag.write("\nDatei Eigenschaften: Maximale Tiefe: " + depth + "\nAnzahl der Dateien: " + anz + "\n"); diag.write("Labellänge: " + llc + " - " + (llv + llc) + "\n" + "Textlänge: " + dlc + " - " + (dlv + dlc) + "\n"); for (int i = 0; i < depth; i++) { diag.write("Ebene " + (i + 1) + ", Elemente: " + ele.get(i) + "\n"); } for (int i = 0; i < anz; i++) { // For-Schleife für jede Datei // StringBuffer resetten for (int b = 0; b < maxb; b++) { sb[b] = new StringBuffer(); } fdoc = new FileWriter(new File(filename + i + ".dtd")); filename2 = filename + i + ".xml"; datei = new File(filename2); fw = new FileWriter(datei); fw.write("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"); /* * fw.write("<!DOCTYPE EEMTEST SYSTEM \"" + filename + i + ".dtd" + * "\">\n"); */ fw.write("<EEMTEST>\n"); CreateXml(fw); fw.write("\n"); fw.close(); // Vergroessern der Datei if (datei.length() < 1000) { usebuffer = 1; while (usebuffer * datei.length() < 1000) usebuffer++; if (usebuffer > maxb) usebuffer = maxb; usebuffer--; // Anzahl der Verdoppelungen um 1 verringern fr = new FileReader(datei); Seite 16 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser br = new BufferedReader(fr); // while ((line = br.readLine()) != null) { if (line.compareTo("<?xml version=\"1.0\" encoding=\"ISO8859-1\"?>") == 0) { // XML Version ignorieren } else if (line.compareTo("<!DOCTYPE EEMTEST SYSTEM \"" + filename + i + ".dtd" + "\">") == 0) { // DOCTYPE ignorieren } else if (line.compareTo("<EEMTEST>") == 0) { // ersten öffentlichen Tag ignorieren } else if (line.indexOf('<') == line.lastIndexOf('<')) { // Öffentliche und schließende Tags in den Buffer // aufnehmenden for (int u = 0; u < usebuffer; u++) { sb[u].append(line); sb[u].append('\n'); } } else { // Neue Dateneinträge erstellen for (int u = 0; u < usebuffer; u++) { sb[u].append(line.substring(0, line.indexOf('>') + 1)); sb[u].append(ranText(dlc + rand.nextInt(dlv))); sb[u].append(line.substring (line.lastIndexOf('<'))); sb[u].append('\n'); } } } br.close(); fr.close(); // Neue Einträge schreiben fw = new FileWriter(datei, true); for (int u = 0; u < usebuffer; u++) { fw.write(sb[u].toString()); fw.write("\n"); } // Abschließenden Tag schreiben fw.write("</EEMTEST>\n"); fw.close(); fdoc.close(); } else { // Datei wird nicht vergrößert // Abschließenden Tag schreiben fw = new FileWriter(datei, true); fw.write("</EEMTEST>\n"); fw.close(); fdoc.close(); Seite 17 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser } // Dateilänge merken fl[i] = datei.length(); } // Dateigröße erstellen for (int j = 0; j < anz; j++) erg += ((double) fl[j]) / anz; // Dateigröße schreiben diag.write("Durchschnittliche Dateigroeße: " + erg + " Byte \n"); diag.close(); // Files ohne DTD-Erstellen generieren for (int i = 0; i < anz; i++) { try { fw = new FileWriter(filename + i + "o.xml"); fr = new FileReader(filename + i + ".xml"); br = new BufferedReader(fr); while ((line = br.readLine()) != null) { if (line.compareTo("<!DOCTYPE EEMTEST SYSTEM \"" + ^ filename+ i + ".dtd" + "\">") == 0) { // DOCTYPE ignorieren } else { fw.write(line); fw.write("\n"); } } fw.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("Files created"); } private static void initialsing() { depth = rand.nextInt(6) + 2; // Tiefe /* Maximale Anzahl der Elemente auf der Ebene 0 */ ele.add(rand.nextInt(4) + 3); ele.add(rand.nextInt(4) + 2); Seite 18 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 ele.add(rand.nextInt(4) + 2); ele.add(rand.nextInt(5) + 2); ele.add(rand.nextInt(6) + 2); ele.add(rand.nextInt(3) + 2); ele.add(rand.nextInt(3) + 1); ele.add(rand.nextInt(3) + 1); llc = 5; // Labellengthconstant, llv = 10; // Labellenghtvariable, dlv = 10; // Datalenghtvariable dlc = 20; // Datalengthconstant, } } Config-Interface package eemw2010; public interface Config { public final static int anz = 100; public final static String filename = "c:\\test\\test"; public final static String diagname = "C:\\test\\diag100.txt"; } Aelfred Parser Test package eemw2010; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class AelfredTest implements Config { /** * @param args */ Seite 19 von 24 XML-Parser Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser public static void main(String[] args) { // TODO Auto-generated method stub int i = 0; long start = 0, end = 0, t = 0; BufferedWriter diag; File f[] = new File[anz]; DefaultHandler tmp = new DefaultHandler(); for (i = 0; i < anz; i++) f[i] = new File(filename + i + "o.xml"); start = System.currentTimeMillis(); try { diag = new BufferedWriter(new FileWriter(new File(diagname), true)); SAXParserFactory spf = net.sf.saxon.aelfred.SAXParserFactoryImpl .newInstance("net.sf.saxon.aelfred.SAXParserFactoryImpl",null); SAXParser sp = spf.newSAXParser(); for (i = 0; i < anz; i++) { sp.parse(f[i], tmp); } end = System.currentTimeMillis(); t = end - start; diag.write("Aelfred Parser: Verbrauchte Zeit = " + t + "\n"); diag.close(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { } } } CrimsonParser2 Parser Test package eemw2010; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; Seite 20 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser import java.io.IOException; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public class CrimsonParser2 implements Config { public static void main(String[] args) { int i = 0; long start = 0, end = 0, t = 0; BufferedWriter diag; start = System.currentTimeMillis(); try { org.apache.crimson.parser.Parser2 p = new org.apache.crimson.parser.Parser2(); diag = new BufferedWriter(new FileWriter(new File(diagname), true)); for (i = 0; i < anz; i++) { p.parse(new InputSource(filename + i + "o.xml")); } end = System.currentTimeMillis(); t = end - start; diag.write("Crimson Parser2: Verbrauchte Zeit = " + t + "\n"); diag.close(); } catch (SAXException e) { System.out.println(i); // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { } } } XercesDocumentBuilderImpl Test package eemw2010; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; Seite 21 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; public class XercesDocumentBuilderImplTest implements Config { public static void main(String[] args) { int i = 0; long start = 0, end = 0, t = 0; BufferedWriter diag; File f[] = new File[anz]; for (i = 0; i < anz; i++) f[i] = new File(filename + i + ".xml"); start = System.currentTimeMillis(); try { diag = new BufferedWriter(new FileWriter(new File(diagname), true)); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); for (i = 0; i < anz; i++) { db.parse(f[i]); } end = System.currentTimeMillis(); t = end - start; diag.write("XercesDocumentBuilderImpl Parser: Verbrauchte Zeit = " + t + "\n"); diag.close(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } Xerces DOM Test package eemw2010; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.w3c.dom.bootstrap.DOMImplementationRegistry; import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSParser; Seite 22 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser public class XercesDomParserImplTest implements Config { public static void main(String[] args) { // TODO Auto-generated method stub int i = 0; long start = 0, end = 0, t = 0; BufferedWriter diag; start = System.currentTimeMillis(); LSParser builder; System.setProperty(DOMImplementationRegistry.PROPERTY, "org.apache.xerces.dom.DOMXSImplementationSourceImpl"); DOMImplementationRegistry registry; try { diag = new BufferedWriter(new FileWriter(new File(diagname), true)); registry = DOMImplementationRegistry.newInstance(); DOMImplementationLS impl = (DOMImplementationLS) registry .getDOMImplementation("LS"); builder=impl.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null); for (i = 0; i < anz; i++) {builder.parseURI(filename + i + ".xml");} end = System.currentTimeMillis(); t = end - start; diag.write("XercesDomParser Parser: Verbrauchte Zeit = " + t + "\n"); diag.close(); } catch (ClassCastException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } Xerces Sax Parser Test package eemw2010; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; Seite 23 von 24 Beiglböck, Fuker, Pichler Entwurf, Errichtung und Management von Datennetzen WS09 XML-Parser public class XercesSaxParserTest implements Config { public static void main(String[] args) { int i = 0; long start = 0, end = 0, t = 0; BufferedWriter diag; start = System.currentTimeMillis(); try { diag = new BufferedWriter(new FileWriter(new File(diagname), true)); XMLReader x = XMLReaderFactory.createXMLReader(); for (i = 0; i < anz; i++) { x.parse(filename + i + ".xml"); } end = System.currentTimeMillis(); t = end - start; diag.write("Xerces Sax Parser: Verbrauchte Zeit = " + t + "\n"); diag.close(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } Seite 24 von 24