Beispiel 3

Java, DOM und SAX

Laden Sie sich die Java Programmvorlage herunter und vervollständigen Sie die Methoden nach den entsprechenden Vorgaben.

Kommentieren Sie Ihren Source-Code! Beim Kontrollgespräch müssen Sie in der Lage sein, die Funktionsweise des Programms zu erklären und anhand eines einfachen XML-Fragments den Programmablauf zu beschreiben.

Verwenden Sie keine absoluten Pfade in Ihrem Programm um die Lauffähigkeit auf dem Server zu gewährleisten!

Um eine Fehlerbehandlung brauchen Sie sich in dieser Übung nicht zu kümmern.

Zum Testen können Sie folgende XML-Dateien verwenden:

Beachten Sie, dass der Inhalt der XML-Dateien im Browser eventuell anders dargestellt wird, als er wirklich ist. Z.B. werden Namespace-Deklarationen entfernt, etc. Benutzen Sie daher einen einfachen Texteditor, um die Dateien anzusehen.

Document Object Model und Simple API for XML

Die folgenden drei Beispiele können sowohl mit als auch ohne Berücksichtigung von Namespaces gelöst und abgegeben werden, die maximale Punkteanzahl können Sie jedoch nur mit der Berücksichtigung von Namespaces erreichen. Ohne Namespace-Behandlung wird ihnen pro Beispiel jeweils ein Punkt abgezogen.

Document Object Model

Vervollständigen Sie die Methode dom(String filename) so, dass ein übergebenes XML-Dokument (Dateiname als String) wie folgt verarbeitet wird:

Eventuell zugehörige DTDs oder Schema-Definitionen müssen nicht bearbeitet werden. Dass das Dokument nach der Bearbeitung nicht mehr der Definition entspricht, ist hier nicht relevant.

Verwenden Sie zur Realisierung des Beispiels einen DOM-Baum. Das resultierende Dokument soll in die Datei beispiel3-dom.xml ausgegeben werden - vergeben Sie einen plausiblen XML-Header.

Tipp: Sehen Sie sich die Methode renameNode der Document-Klasse genauer an.

Am Ende der Durchführung soll die Statistik der Elemente/Attribute in der Konsole ausgegeben werden.

Anmerkungen zur Namespace-Variante:

Der Namespace-Prefix soll nicht verändert werden, achten Sie weiters darauf, dass Namespace-Deklarationen erhalten bleiben sollen. In der Test-Datei darf z.B. xmlns:DBai nicht in xmlns:dbai geändert werden, Sie sollten daher den Prefix xmlns gesondert behandeln. Auch soll der Prefix bei Elementnamen erhalten bleiben. Aus soft:elementName soll also soft:emaNtnemele werden, und nicht etwa tfos:emaNtnemele oder gar emaNtnemele:tfos.

Erwartete Ausgabe:

Die Variante mit Namespace-Behandlung muss mit beiden Testdateien umgehen können, die Variante ohne Namespace-Behandlung lediglich mit der ersten der beiden Testdateien.

Simple API for XML

Vervollständigen Sie die Methode sax(String filename) so, dass das übergebene XML-Dokument (Dateiname als String) gleich behandelt wird, wie im vorigen Beispiel, mit folgenden Änderungen:

Bei SAX-Parsern kann es hilfreich sein, wenn Sie bei Ihrem XMLReader das Feature http://xml.org/sax/features/namespace-prefixes verwenden. Dadurch werden unter anderem die Namespace-Deklarationsattribute xmlns und xmlns:prefix in das Attributobjekt bei startElement() inkludiert.

Erwartete Ausgabe:

DOM und SAX

Vervollständigen Sie die Methode domsax(String filename) so, dass ein übergebenes XML-Dokument (Dateiname als String) wie folgt verarbeitet wird:

Kümmern Sie sich in diesem Beispiel nur um Elemente, Attribute, Processing-Instructions und Text. Alle anderen Knotentypen und Events müssen nicht beachtet werden.

Erwartete Ausgabe:

Generelle Tipps (DOM/SAX):

Wenn Sie weitere Klassen benötigen, so können Sie Inner-Classes (Klassendefinition in einer Klasse) verwenden. Dadurch ersparen Sie sich separate Java-Dateien, auf die Sie beim Hochladen achten müssen.

Beachten Sie, dass SAX nicht garantiert, dass der gesamte Text-Inhalt in einem einzigen Event gelesen wird! Treffen Sie entsprechende Vorkehrungen, sollten Sie mit Text arbeiten.

XPath

Schreiben Sie für die folgenden Anforderungen eine XPath-Anfrage auf dieses XML-Dokument.

Für das Testen der XPath-Anfragen können Sie das grafische Tool XPathWay (tar.bz2, zip) verwenden. Kontrollieren Sie, ob Ihre Anfragen die richtigen Ergebnisse liefern.