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)).
Beispiel3.java
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.
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.
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.
xpath.txt
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";
xquery.xq