Dokumentation - Smithes/WBA2 GitHub Wiki

Aufgabe 1

Aufgabe 1

Wohlgeformtheit:

Unter Wohlgeformtheit versteht man, dass innerhalb eines XML-Dokumentes alle XML-Regeln befolgt wurden: - das XML-Dokument muss eine korrekte Syntax vorweißen. - es besitzt einen Wurzelknoten - alle Tags sind richtig geschlossen/geöffnet - es gibt keine überlappenden Tags - ein Element darf nicht mehrere Attribute mit dem selben Namen besitzen - case sensitive -> XML achtet auf Groß- und Kleinschreibung, so kann ein Element das Attribut "menge" haben und gleichzeitig auch das Atribut "Menge" besitzen - Attributwerte müssen in Anführungszeichen stehen

Validität:

Ein wohlgeformt XML Dokument erreicht die Validität, wenn es mit einem Schema geprüft wurde. Es muss dabei den diesen Bestimmtungen folgen: - ein XML Dokument ist gültig, wenn es semantisch korrekt ist - Datentypen sind richtig gesetzt - alle Restriktionen wurden eingehalten

Namespaces:

Namespaces, zu deutsch "Namenräume" dienen dazu, dass das Vokabular in einem XML Dokument eindeutig identifiziert wird. Sie helfen dabei Namenskonflikte zu vermeiden und ermöglichen es mehrere Namensräume zu benutzen. Am Anfang eines jeden XML-Schemas wird der Standardnamensraum innerhalb einer URI festgelegt: ``

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.

Aufgabe 2

2a.

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.

2b.

Die JSON Datei wurde so äquivalent wie möglich gebaut. Die Gruppen werden in einem Array gespeichert. Sie besitzen eine Gruppen-ID und einen Gruppenleiter. Darüber hinaus haben sie auch noch ein Mitglieder-Array, in welchem die Mitglieder mit ihren zugehörigen IDs gespeichert werden.

Aufgabe 3

3a.

Zur möglichst genauen Darstellung des Rezeptes wurden zahlreiche Container zur Unterteilung benutzt. Alle Rezepte liegen in einem `` Container. Jedes Rezept beinhaltet die Container: ``, ``, ``, ``,``, ``, ``, `` und ``.

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.

3b.

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.

3c.

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.

Aufgabe 4

4a.

Um die komplizierte Instalation eines Plugins zu vermeiden, wurde die aktuellste Version von Eclipse runtergeladen. So konnte direkt mit Rechtsklick>Generate>JAXB die Javaklasse des zugehörigen XML-Schemas erstellt werden.

4b.

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.

rezeptListe

Mit einer For-Schleife wird wird die mit übergebene Rezeptliste durchlaufen und jeder Rezepttitel ausgegeben.

rezeptZeigen

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.

4c.

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.

rezeptKommentieren

Zunächst muss ein Benutzername eingegeben werden. Anschließend gibt der Benutzer seinen Kommentar zum Rezept ein. Beide Informationen werden zuerst in Strings zwischengespeichert.

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.

Aufgabe 5

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.

⚠️ **GitHub.com Fallback** ⚠️