Dokumentation - Smithes/WBA2 GitHub Wiki
Durch das setzen eines Präfixes wird definiert, welcher Namespace genutzt wird.:
<xs:element name="fotos" type="fotosType" />
Es ist zu beachten, dass Kindelemente nicht automatisch den namespace des Elternelements übernehmen.
Das XML-Dokument wird mit dem Tag <gruppe>
geöffnet und mit </gruppe>
geschlossen. Jede Gruppe hat zur Identifizierung eine eindeutige Gruppen-ID,"group_id".
Innerhalb der Gruppe wird zwischen dem Gruppenleiter und den weiteren Mitgliedern unterschieden. Die Mitglieder haben, wie die Gruppe, eine eindeutige Nummer, damit sie identifiziert werden können. Bei dem Gruppenleiter wird auf die Nummer verzichtet, da jede Gruppe nur einen Gruppenleiter besitzt.
Da die Tutoren dazu geraten haben, nicht zu viel Wert auf grafische Elemente zu legen, wird auf Dropdownmenüs verzichtet. Man könnte aber in einem XML-Schema mit Restriktionen vorgebene Werte angeben, welche ausschließlich eingetragen werden können.
Es wurde auch überlegt statt der Container <gruppenleiter>
und <personen>
Attribute zu benutzen. Jedoch ist fest zu stellen, dass es dafür keine Auswahlmöglichkeit gibt.
Um mehrere Fotos hinterlegen zu können, sind im <fotos>
Container einzelne <foto>
Container. Das Foto-Element hat die Kindelemente <benutzer>
und <bildadresse>
.
Ganz nach dem Rat der Tutoren (nicht zu viel Wert auf grafische Elemente zu legen), wurde auf eine Slideshow verzichtet und die Bilder wurden per URI eingebunden
Die Zutaten werden mit den Attributen "einheit", "menge" und "Name" abgespeichert.
Es gibt aber auch die Möglichkeiten dem Element <butter>
die Kindelemte <einheit>
und <menge>
zu geben. Zur besseren Übersicht, wurde jedoch auf diese Möglichkeit verzichtet.
Die Struktur der Reptze ist gleich. Alle Rezepte besitzen einen Titel, einpaar Fotos von Benutzern, eine Aufzählung der Zutaten, Angaben zu Portionsgröße, Arbeitszeit, Schwierigkeitsgrad, Brennwert, Zubereitung und einen Kommentarbreich. Unterschiedlich sind hierbei die Einheiten und Mengen der verschiedenen Zutaten. So wird z.B. Zitronensaft mal in EL=Esslöffen angegeben und mal in Tropfen angegeben. Selbstverständlich hat jedes Rezept einen eigenen Titel, Bilder, Kommentare und individuelle vorgehensweißen in der Zubereitung.
Beim erstellen eines XML-Schemas sollte folgender Grundsatz befolgt werden:"Soviele Einschrenkungen wie nötig und so viele Freiheiten wie möglich."
Über Sequenzes wird erreicht, dass Jedes rezept den selben Aufbau haben. Sprich die Elemente immer in der selben Reihenfolge angegeben sind.
Es wird zwischen simplen und komplexen Datentypen unterschieden.
- Simple Datentypen enthalten Text, z.b.
titel
,portionen
,nachricht
. - komplexe Datentypen sind Elemte, welche weitere Elemente beinhalten z.b.
rezepte
,foto
,brennwert
Die Schwierigkeitsangabe ist auf "leicht", "mittel" oder "schwer" festgelegt. So wird vermieden dass unklare Angaben gemacht werden können, wie z.B. "mittelschwer" oder "semi-leicht".
<xs:enumeration value="leicht" /> <xs:enumeration value="normal" /> <xs:enumeration value="schwer" />
Es muss mindestens eine Zutat angegeben werden, damit es als Rezept gilt. Die Obergrenze ist aber nicht festgelegt.
Da Mengenangaben nur Zahlen sind, welche Nachkommastellen beinhalten können, z.b. 1,5 TL, sind alle Mengen Dezimalzahlen. Damit aber keine negativen Zahlen eingegeben werden können, wurde eine Restriktion auf min 0 gestzt. <xs:minInclusive value="0" />
Text, z.b: titel
, nachricht
und name
wird als String abgespeichert.
Für das Datum gibt es einen eigenen Datentyp: dateTime
.
Brennwert ist ein positiver Integer.
Zum Verknüpfen von XML und Java müssen der "Marshaller" und der "Unmarshaller" genutzt werden.
Beim Start des Programms wird zunächst festgestellt ob Rezepte gespeichert sind. Ist dies der Fall, gelangt man ins Hauptmenü.
Im Hauptmenü des Programms wird man gefragt, welche Aufgabe man erledigt werden soll:
- alle Rezeptnamen anzeigen
- drstellen eines Rezept
- ein Rezept kommentieren
- das Programm beenden
Zur leichteren Übersichtlichkeit sind alle Funktionen in die Klasse Rezepte ausgelagert.
Die Zeile static final String XML = "../Phase1/phase 1/Aufgabe3/3a.xml";
legt fest, wo sich die XML Datei befindet.
Sowohl bei der Auswahl für ein Rezept anzeigen und ein Rezept kommentieren wird zunächst überprüft, ob eine gültige Rezeptnummer eingegeben wurde.
Mit einer For-Schleife wird wird die mit übergebene Rezeptliste durchlaufen und jeder Rezepttitel ausgegeben.
Informationen von simplen Datentypen können mit einem simplen .get
-Befehl ausgelesen werden.
Bei komplexen Datentypen müssen die Informationen erst in einer Luste abgespeichert werden und dann kann wie beim Auflisten von Rezepten eine For-Schleife benutzt werden.
Bei optionalen Daten wie z.B. der Einheit von Zutaten muss zuerst geprüft werden, ob die gesuchte Information vorhanden ist. Dies geschieht mit der Zeile: if (zutat.getEinheit() != null)
. Der nachfolgende Befehl wird nur ausgeführt, wenn die Funktion zutat.getEinheit()
einen Wert zurück gibt.
Da beim Erstellen der Javaklasse mit JAXB das Wurzelelement nicht richtig gekennzeichnet wurde, wird die Funktion Streamsource
benutzt, anstelle von FileReader
. Hierbei muss zusätzlich der Wurzelknoten angegeben werden.
Mit der Zeile KType kommi = new KType();
Wird ein neuer Kommentar erstellt. Anschließend wird in diesen der Benutzername, das aktuelle Datum und der Kommentar über die Setter-Methoden eingespeichert.
Wegen Kompatibilitätsschwierigkeiten musste das Datum erst mit dem GregorianCalendar
erzeugt werden und dann in den XMLGregorianCalendar
umgespeichert werden.
In der Main Klasse wird dann mit dem Unmarshaller
in die XML Datei geschrieben. Zunächst wird mit der Klasse objectFactory ein neus Objekt mit der Struktur von Rezept
erzeugt. Abschließend gibt man noch die Datei an, in welchem das neue Objekt gespeichert wird.
Um Informationen strukturiert darzustellen, ist es sinnvoll XML und JSON zu benutzen. Während sich JSON aus einfacher und leicht lesbarer Syntax besteht ist XMl eine Markupsprache ist.
JSON: - valides JavaScript - einfachere und lesbarere Syntax - Einsatzgebiet -> Speicherplatz und cpu-leistung rar - Daten sind Typisiert - JSON Definitionen lassen sich per eval()-Funktion in JavaScipt Objekte umwandeln - Datenaustauschfromat
XML: - Werte und Eigenschaften können als Attribute oder kindknoten beschrieben werden (-) - Eigene Typen erstellen - Vielseitiger einsetzbar - Auszeichnungssprache
Da bei XML neben den Nutzdaten auch noch die Attribute mit gesendet werden, lohnt es sich XML bei eher größeren Datenmengen zu benutzen.