Skip to Content

TU Wien Fakultät für Informatik DBAI Database and Artificial Intelligence Group
Top-level Navigation: Current-level Navigation:

Path: DBAI > Education > Semistrukturierte Daten > Übung > Beispiel 3

Tools: Drucken


Beispiel 3

Java API for XML processing: DOM, 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.

Verwenden Sie folgende XML-Datei zur Bearbeitung der im Folgenden gestellten Aufgaben:

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.

In dieser Beispieldatei wurden bewusst mehrere Namespaces gleichzeitig verwendet, um ihnen die unterschiedliche Behandlung von Namespaces durch die hier geübten Standards (DOM, SAX, XPath, XQuery) zu verdeutlichen.

Fassen Sie nach Möglichkeit alle ihre Methoden- und Klassendefinitionen in einer einzigen Datei zusammen (siehe dazu: Generelle Tipps (DOM/SAX)).

Document Object Model (DOM)

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

Jeder Elementname des vorliegenden XML-Dokuments soll durch einen möglichst kurzen Namen ersetzt werden. Durch diese Vorgehensweise soll die Größe des XML-Dokumentes reduziert werden (Komprimierung). Berücksichtigen Sie einen eventuell vorhandenen Namespace-Präfix, ändern Sie diesen jedoch nicht.

Für jede dieser Ersetzungen soll eine Processing Instruction direkt vor dem Wurzelelement des XML-Dokuments eingefügt werden, welche die Ersetzung dokumentiert, sodass eine Rückersetzung möglich ist. Diese Processing Instruction soll folgender Syntax gehorchen: <?substitute OldName NewName?>

Dabei sollen die neu eingefügten Processing Instructions nur ein Mal im neuen XML-Dokument aufgeführt werden, auch wenn ein Element mehrmals im XML-Dokument auftritt und dessen Name entsprechend oft durch einen kürzeren ersetzt wurde.

Elementinhalte und Attribute sowie alle weiteren XML-Konstrukte sollen unverändert erhalten bleiben. Ein Beispiel:

Originaldokument:
<xml version="1.0" encoding="UTF-8">
<RootElement>
<LongNameElement>Content A</LongNameElement>
<LongNameElement>Content B</LongNameElement>
</RootElement>

Erwartete Ausgabe:
<xml version="1.0" encoding="UTF-8">
<?substitute RootElement r?>
<?substitute LongNameElement e1?>
<r>
<e1>Content A</e1>
<e1>Content B</e1>
</r>

Verwenden Sie zur Realisierung des Beispiels einen DOM-Baum. Das resultierende Dokument soll in die Datei beispiel3-dom.xml ausgegeben werden. Verwenden Sie dazu wahlweise einen Transformer oder einen Serializer. Achten Sie darauf, dass die ausgegebene Datei gültigen XML-Code enthält!

Tipps: Sehen Sie sich die Methode renameNode der Document-Klasse genauer an. In der selben Klasse finden Sie auch die Methode createProcessingInstruction, die für diese Aufgabe hilfreich sein kann.

Simple API for XML (SAX)

Vervollständigen Sie die Methode sax(String xmlInput) so, dass das im vorigen Schritt mittels DOM erstellte, komprimierte XML-Dokument beispiel3-dom.xml wie folgt verarbeitet wird:

Die Ersetzung (Komprimierung) der Elementnamen durch kürzere Ausdrücke soll rückgängig gemacht werden. Lesen Sie dazu die Ersetzungsvorschriften aus den im vorigen Schritt ins XML-Dokument eingefügten Processing Instructions.

Entfernen Sie die zur Komprimierung eingefügten Processing Instructions aus dem XML-Dokument. Ein Beispiel:

Dokument nach der Komprimierung:
<xml version="1.0" encoding="UTF-8">
<?substitute RootElement r?>
<?substitute LongNameElement e1?>
<r>
<e1>Content A</e1>
<e1>Content B</e1>
</r>

Beispielhafte Ausgabe:
<xml version="1.0" encoding="UTF-8">
<RootElement>
<LongNameElement>Content A</LongNameElement>
<LongNameElement>Content B</LongNameElement>
</RootElement>

Geben Sie das resultierende Dokument der Einfachheit halber auf der Konsole aus.

Verwenden Sie zum Einlesen des Dokuments einen SAX-Parser und realisieren Sie die geforderten Änderungen mittels eines Filters. Sie können diese Aufgabe auch ohne die Verwendung eines Filters lösen, erhalten in diesem Fall aber einen Abzug von 2 Punkten.

Achten Sie darauf, dass das resultierende XML-Dokument bis auf eventuelle überflüssige Whitespaces zur ursprünglichen XML-Vorlage äquivalent ist!

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 jede der folgenden Anforderungen eine XPath-Abfrage zu der selben XML-Dokument-Vorlage wie im ersten Teil dieses Übungsbeispiels (Java API):

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.

XQuery

Formulieren Sie folgende Anfrage an das XML-Beispiel-Dokument mittels einer XQuery-FLWOR-Expression:

Die Ausgabe soll hiernach als XML-Fragment in folgender Form erfolgen:
<customer account="123">
<name>NAME</name>
<circulation>NUMBER OF LOANED BOOKS</circulation>
...
</customer>

Hinweis: Sie müssen vor der Formulierung der FLWOR-Expression die im vorliegenden XML-Dokument verwendeten Namespaces und die zugehörigen Präfixe mit Hilfe des Schlüsselwortes declare deklarieren. Die Syntax dazu lautet:
declare namespace PREFIX="URI";

Ein Beispiel:
declare namespace xsd="http://www.w3.org/2001/XMLSchema";


Home / Kontakt / Webmaster / Offenlegung gemäß § 25 Mediengesetz: Inhaber der Website ist das Institut für Logic and Computation an der Technischen Universität Wien, 1040 Wien. Die TU Wien distanziert sich von den Inhalten aller extern gelinkten Seiten und übernimmt diesbezüglich keine Haftung. Disclaimer / Datenschutzerklärung