Ziel der Aufgabe ist es, XML Instanzdokumente per SAX und DOM zu verarbeiten, die dem Memory Spiel Schema aus Beispiel 2 entsprechen. Mittels SAX soll aus dem XML Dokument redundante Information entfernt werden. Unter Nutzung von DOM soll anschließend diese fehlende Information korrekt generiert werden.
Nicht alle Constraints können durch das XML Schema abgedeckt werden. So kann es zB. vorkommen, dass der
Spielstatus auf NONE
gestellt ist, gleichzeitig aber zwei Karten aufgedeckt sind. Ein solches Spiel wäre zwar
gegenüber dem XML Schema gültig, als Memory-Spiel aber klarerweise ungültig. Diese Abhängigkeiten gilt es weiters zu überprüfen.
Sie können zum Lösen der Aufgabe die von Ihnen bei Beispiel 2 erzeugten Dateien hier weiterverwenden. Beachten Sie allerdings, dass die XML Instanzen gültig nach dem XML-Schema, wie es in der Aufgabenstellung zu Beispiel 2 definiert wurde, sein müssen. Folgende XML-Datei kann ebenfalls verwendet werden: memory.xml
Laden Sie sich das Java Codegerüst herunter und vervollständigen Sie die
Methoden in der Datei Beispiel3.java
nach den entsprechenden Vorgaben.
Das Codegerüst enthält neben der Datei Beispiel3.java
noch einen Ordner api
,
in welchem sich drei Java Klassen befinden, welche Sie bei der Implementierung der unten
stehenden Aufgaben für DOM unterstützen. Diese können Sie bei Bedarf natürlich auch ändern, stellen Sie aber sicher, dass die ursprüngliche Funktionalität erhalten bleibt.
Für nähere Informationen wie Sie die API richtig verwenden - siehe: Memory XML API.
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.
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
sax(String memoryXML, String filteredMemoryXML)
so, dass die Datei
memoryXML
folgendermaßen gefiltert wird:
covered-pairs
falls es in der XML-Datei vorkommt.
Entfernen Sie außerdem auch alle Kindelemente dieses Elements (pair
).
uncovered-pairs
, wenn es in der XML-Datei als Kindelement
vom Dokumentelement game
vorkommt. Entfernen Sie außerdem auch alle Kindelemente
dieses Elements (pair
).
Das Resultat soll mittels eines Transformers in die Datei
filteredMemoryXML
ausgegeben werden.
Verwenden Sie zum Einlesen des Dokuments einen SAX-Parser und realisieren Sie die geforderten Änderungen mittels eines Filters.
Beachten Sie, dass die resultierende Datei gültig nach dem im Beispiel 2 gefordertem XML Schema sein muss.
Vervollständigen Sie die Methode
dom(String filteredMemoryXML, String checkedMemoryXML)
so,
dass die Datei filteredMemoryXML
folgendermaßen bearbeitet
wird:
Bei der Datei filteredMemoryXML
handelt es sich um die im SAX Teil
erstellte Datei. In dieser befinden sich also keinesfalls mehr die Elemente
covered-pairs
und uncovered-pairs
(falls Kindelement von game
), sowie deren
Kindelemente.
Diese Datei soll nun zuerst mittels DOM eingelesen und in die interne Datenstruktur Game
(siehe Memory XML API) überführt werden. Rufen Sie dazu einfach den Konstruktur der Klasse Game
mit dem DOM Document
als Argument auf. Danach soll das dadurch erzeugte Objekt
auf eine Reihe von Abhängigkeiten, die nicht durch das Schema allein sichergestellt werden können, überprüft werden. Beachten Sie, dass diese Überprüfung bereits durch die Methode isValid
der Klasse Game
in der API implementiert wurde. Sie brauchen diese also einfach nur aufzurufen.
Liegt ein Memory Spiel mit gültigen Abhängigkeiten vor, dann soll die durch SAX entfernte Information wieder korrekt generiert werden. Dazu müssen Sie die Elemente covered-pairs
und uncovered-pairs
mit ihren Kindelementen (pair
) erzeugen. Die dazu nötige Information wird bereits durch die API (Methoden generateGameCoveredPairs
und generateGameUncoveredPairs
) zur Verfügung gestellt. Sie müssen sich also hauptsächlich auf das Einfügen mittels DOM konzentieren. Fügen Sie die erstellten Elemente vor dem players
Element ein.
Das resultierende
Dokument soll in die Datei checkedMemoryXML
ausgegeben werden.
Verwenden Sie dazu einen Transformer.
Achten Sie darauf, dass die ausgegebene Datei gültig nach dem im Beispiel 2 definiertem XML Schema ist.
Stellen Sie außerdem sicher, dass die Ausgabe in übersichtlich eingerückter Form vorliegen soll (siehe zB. Tipps).
Liegt ein Memory Spiel mit ungültigen Abhängigkeiten vor, dann soll lediglich eine entsprechende Fehlermeldung auf System.out
ausgegeben werden.
Tipps
setOutputProperty(OutputKeys.INDENT, "yes")
.
Memory XML API:
Game
Konstruktor erwartet ein DOM Document
welches von einer gültigen XML Instanz (laut Schema aus Beispiel 2) erzeugt wurde.
Game
erzeugen und anschließend die Methode isValid()
aufrufen, welche für die Überprüfung zuständig ist. Beachten Sie aber, dass diese Methode nicht null
-safe ist und somit bei
unzulässig gesetzten Attributen in Game
eine NullPointerException
werfen kann.
Set
zu erhalten, können Sie bei einem gültigen Memoryspiel die
Methode generateGameUncoveredPairs()
aufrufen.
Set
zu erhalten, können Sie bei einem gültigen Memoryspiel die
Methode generateGameCoveredPairs()
aufrufen.
Generelle Tipps (DOM/SAX):
Schreiben Sie für jede der folgenden Aufgabenstellungen eine XPath-Abfrage. Verwenden Sie dazu wieder folgende XML-Datei: memory.xml
Für das Testen der XPath-Anfragen können Sie das grafische Tool XPathWay (Version 1.01) verwenden. Weitere Nutzungshinweise zu XPathWay finden Sie auf der Übungsseite. Kontrollieren Sie, ob Ihre Anfragen die richtigen Ergebnisse liefern.
xpath.txt
Formulieren Sie folgende Anfrage an dasselbe XML-Beispiel-Dokument, welches Sie bereits im XPath-Teil verwendet haben, mittels einer XQuery-FLWOR-Expression:
Die Ausgabe soll hiernach als XML-Fragment in folgender Form erfolgen:
<player playing-time="123">
<name>NAME</name>
<uncovered-count-column1>NUMBER OF UNCOVERED CARDS</uncovered-count-column1>
</player>
...
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