XML Grundaufbau Tutorial

XML-Grundaufbau

Wozu dient XML im Gegensatz zu HTML?

XML dient zum Transport und zur Ablage/Sicherung von Daten, wohingegen HTML zur Darstellung von Daten gedacht ist.

Was ist XML?

  • XML steht für "eXtensible markup language".
  • XML ist HTML sehr ähnlich.
  • XML wurde gemacht um Daten zu transportieren, nicht um Daten darzustellen.
  • XML Tags sind nicht vordefiniert. Man muss sich seine Tags selbst definieren.
  • XML wurde derart gestaltet, dass sie sich selbst beschreibt

XML tut absolut gar nichts

XML strukturiert, speichert und transportiert Informationen.
Man kann mit dieser Sprache nichts senden, empfangen oder darstellen. Man kann lediglich Informationen zwischen Tags schreiben, welche die Information näher beschreiben.

XML ersetzt HTML nicht

Es ist wichtig zu verstehen, dass XML nicht HTML ersetzen kann oder soll. XML ist ein Zusatz zu HTML mit dem man Daten an das HTML Dokument sendet, welches dann die Daten darstellen kann.

XML ist Soft- und Hardwareunabhängig

Man kann XML, genau wie HTML, in jedem beliebigen Texteditor schreiben, der reinen Text darstellen kann.

Der XML Dokumentbaum

XML Dokumente haben eine Baumstruktur. Sie starten mit dem Wurzelelement und diversifizieren sich dann bis zu "Zweigen" und "Blättern.

Beispiel:

1.: <?xml version="1.0" encoding="ISO-8859-1"?>
2.: <notiz>
3.:  <an>Blubb</an>
4.:  <von>Bla</von>
5.:  <ueberschrift>Dings</ueberschrift>
6.:  <inhalt>Palaver Palaver Rhabarber.</inhalt>
7.: </notiz>

Die erste Reihe ist die XML-Deklaration. Sie definiert die XML Version (1.0) und die Encodierung, welche benutzt wurde (ISO-usw, kann auch UTF-8 oder sonstwas sein). Die zweite Reihe is das Wurzelelement, welches alle anderen Tags umschließt. Es sagt in diesem Fall aus, dass es sich um eine Notiz handelt. Die nächsten 4 Elemente sind Kindelemente der Wurzel (Zweige). Die letzte Zeile schließt das Wurzelelement. Man erkennt also, dass es sich um eine Notiz von Bla an Blubb handeln muss.

XML Dokumente müssen ein Wurzelelement enthalten, welches das Elternelement aller anderen Elemente ist.
Da alle Elemente wiederum Kindelemente enthalten können, ergibt sich so eine Baumstruktur von der Wurzel, über die Zweige und deren Äste zu den Blättern (bildlich gesprochen).

Beispiel:

1.: <?xml version="1.0" encoding="ISO-8859-1"?>
2.: <wurzel>
3.:	<kind>
4.:		<kindvomkind>
5.:			<kindeskind>Blubb</kindeskind>
6.:		</kindvomkind>
7.:	</kind>
8.: </wurzel>

Wie man sieht, könnte man das Ganze ad absurdum weiterführen. Zu beachten ist, dass jedes Element Inhalte und Attribute haben kann.

Ein erweitertes Beispiel für einen Buchladen, welcher seine Bücher in Kategorien einteilt und die einzelnen Bücher nach Titel, Autor, Jahr und Preis katalogisiert.

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book category="children">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="web">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

Syntaxregeln (wie darf man XML schreiben und wie nicht)

Die Syntaxregeln sind sehr einfach und logisch, deswegen kann man sie auch schnell und einfach erlernen.

Alle Elemente müssen ein schließendes Tag haben

Bei XML ist es illegal ein schließendes Tag wegzulassen!
Man geht dafür zwar nicht in den Knast, wenn man dies trotzdem tut, aber die Datei wird nie nicht funktionieren.

In HTML 4.01 und auch in HTML5 ist es erlaubt schließende Tags wegzulassen:
<p>Ein Paragraph
<p>Noch ein Paragraph
Der Browser wird die Paragraphen trotzdem darstellen.

Das einzige "Tag" bzw. Element, welches kein schließendes Tag hat, ist die XML Deklaration. Sie ist nicht Teil des XML Dokumentes sondern teilt nur dem darstellenden Medium mit, um welche Art von Dokument es sich handelt (wie bei HTML Doctype Deklarationen auch).

XML Tags sind case sensitive

Es ist ein Unterschied ob man <Tag> oder <tag> notiert, deswegen ist es wichtig das öffnende und das schließende Tag in der selben Schreibweise zu notieren.
<tag>Bla</Tag> wird nicht funktionieren!

XML Elemente müssen richtig ineinander verschachtelt werden

Es ist nicht erlaubt die Tags durcheinander zu wirbeln. Ein geöffnetes Tag muss auch nach seinem Inhalt wieder geschlossen werden.

Folgendes Beispiel wird nicht funktionieren:
<bla><blubb>text</bla></blubb>

Es darf nur "richtig verschachtelt" werden:
<bla><blubb>Text</blubb></bla>

XML Attribute müssen in Anführungszeichen gesetzt werden

Wie in HTML kann man auch XML-Tags Attributwerte zuweisen, indem man sie im Tag selbst notiert. Sie müssen immer folgender Notierung folgen:

<tag attribut="wert">

Das bedeutet, dass erst der Tag-Name kommt, dann der Name des Attributs, dann ein =-Zeichen und dann der Attributwert in doppelte Anführungszeichen gesetzt.

Eintitas richtig referenzieren

Sonderzeichen wie &, ', ", < und > dürfen nicht ausgeschrieben werden in einem XML-Dokument.

Dies wird einen Fehler generieren:
<tag>bla & blubb > blubb & bla</tag

Um den Fehler zu vermeiden müssen die Sonderzeichen als Entitätsreferenz geschrieben werden:
<tag>bla &amp; blubb &gt; blubb &amp; bla</tag>

Es gibt (zum Glück) nur 5 vordefinierte Entitäten in XML:
&lt; ergibt < (kleiner als)
&gt; ergibt > (größer als)
&amp; ergibt & (das "und-Zeichen oder ampersand)
&apos; ergibt ' (ein Apostroph)
&quot; ergibt " (Anführungszeichen)

Kommentare in XML Dokumenten

Kommentare werden wie in HTML notiert:

<!-- Das ist ein Kommentar -->

Im Westen nichts Neues also.

Leerzeichen sind in XML konserviert

Wenn man in HTML mehr als ein Leerzeichen setzt, so werden diese zu einem einzigen zusammengefasst.
In XML ist dies nicht der Fall und je mehr Leerzeichen man notiert, desto mehr werden auch ausgegeben.

HTML:
<tag>bla blubb</tag>
Ergibt:
bla blubb

XML:
<tag>bla          blubb</tag>
Ergibt:
bla           blubb


So, das wäre dann eigentlich alles zum Grundaufbau von XML. Ich werde weitergehend noch auf XML Elemente und Attribute detailiert eingehen, alles weitere führt definitiv zu weit, wenn man vom Grundaufbau spricht.

Was sind XML Elemente

Ein XML Element ist alles vom öffnenden Tag bis zum schließenden Tag (diese mit eingeschlossen).
Ein Element kann folgendes beinhalten:

  • Weitere Elemente (Kindelemente)
  • Text
  • Attribute
<bookstore>
  <book category="children">
    <title>Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="web">
    <title>Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

Das Beispiel vom Buchladen zeigt sehr gut was das bedeutet.
<bookstore> und <book> haben Kindelemente als Inhalt.
<book> hat außerdem das Attribut "children".
<title>, <author>, <year> und <price> haben außerdem Textinhalte.
Wobei jedes Element alles von dem vorher genannten auch beinhalten kann:
<tag attribut="attributwert">Text
<kind>text</kind>
</tag>

Namenregeln für XML-Elemente

Folgende Regeln sind zu beachten, wenn man XML-Elemente notiert:

  • Namen können Buchstaben, Zahlen und andere Zeichen beinhalten
  • Namen dürfen nicht mit einer Nummer oder einem Interpunktionszeichen beginnen)
  • Namen dürfen nicht mit der Buchstabenkombination xml oder XML beginnen
  • Namen dürfen keine Leerzeichen enthalten

Ansonsten kann man sich total austoben, was die Inhalte eines Elements angeht, da man ja die Tagnamen und Attributnamen selbst definieren kann, wie sie einem gefallen.

Der passende Namen für den passenden Inhalt

Ja, wie soeben erwähnt, kann man wild Tagnamen und Attributsnamen verteilen, wie man lustig ist. Aber natürlich macht es mehr Sinn die Namen passend zu den Inhalten der Elemente zu vergeben.
Man sollte Namen beschreibend wählen! Sie sollten kurz und einfach sein.

To do:
<buch_titel>

Not to do:
<der_titel_des_buchs>

Unterstriche sind gut geeignet um Namen zu strukturieren:
<buch_titel>, <buch_autor>, <buch_jahr>, <buch_preis> zum Beispiel

Man sollte keine Bindestriche, Punkte oder Doppelpunkte verwenden um Namen zu strukturieren, da es Programme gibt, die diese anders interpretieren könnten.

XML Elemente sind "extensible"

XML Elemente können erweitert werden um mehr Information zu transportieren.

Beispiel:

1.: <?xml version="1.0" encoding="ISO-8859-1"?>
2.: <notiz>
3.:  <an>Blubb</an>
4.:  <von>Bla</von>
5.:  <inhalt>Palaver Palaver Rhabarber.</inhalt>
6.: </notiz>

Erweitern wir nun diese Notiz um einige Elemente um zu präzisieren, was für eine Notiz es ist und wann sie verfasst wurde.

Beispiel:

1.: <?xml version="1.0" encoding="ISO-8859-1"?>
2.: <notiz>
3.:	<datum>tt.mm.yyyy</date>
4.:	<an>Blubb</an>
5.:	 <von>Bla</von>
6.:	<ueberschrift>Erinnerung</ueberschrift>
6.:	<inhalt>Laber Palaver Rhabarber.</inhalt>
7.: </notiz>

Ein weiteres Beispiel, welches dies noch eindeutiger macht:

1.: <?xml version="1.0" encoding="ISO-8859-1"?>
2.: <notiz>
3.:	<erinnerung>
4.:		<an>
5.:			<vorname>Bla</vorname>
6.:			<nachname>Blabla</nachname>
7.:			<strasse>Dingsweg</strasse>
8.:			<hausnummer>123</hausnummer>
9.:			<plz>12345</plz>
10.:			<ort>Dingshausen</ort>
11.:		</an>
12.:		<von>
13.:			<vorname>Blubb</vorname>
14.:			<nachname>Blubbblubb</nachname>
15.:			<strasse>Bumsweg</strasse>
16.:			<hausnummer>321</hausnummer>
17.:			<plz>54321</plz</plz>
18.:			<ort>Bumshausen</ort>
19.:		</von>
20.:		<ueberschrift>Hömma</ueberschrift>
21.:		<inhalt>
22.:			<erstens>Laber</erstens>
23.:			<zweitens>Palaver</zweitens>
24.:			<ausserdem>Rhabarber</ausserdem>
25.:		</inhalt>
26.:	</erinnerung>
27.: </notiz>

Die Datei wird immernoch funktionieren, sie ist lediglich viel präziser angelegt, als die vorhergehende Notiz.

XML Attribute und wozu sie gut sind

XML-Elemente können wie HTML-Elemente Attribute enthalten.
Attribute beschreiben zusätzliche Informationen über ein Element.

Beispiel: <person geschlecht="weiblich">

Elemente VS Attribute

Hier sind mal zwei Beispiele wie mans machen kann:

<person geschlecht="weiblich">
  <vorname>Anna</vorname>
  <nachname>Smith</nachname>
</person>

<person>
  <geschlecht>weiblich</geschlecht>
  <vorname>Anna</vorname>
  <nachname>Smith</nachname>
</person>

Im ersten Beispiel ist das Geschlecht ein Attribut, im zweiten Beispiel ein Kindelement von Person. Beide Beispiele transportieren die selbe Information.

Es gibt in diesem Fall keine eindeutige Regel, wie man es besser macht. Attribute sind sehr nützlich in HTML, bei XML würde ich darauf eher verzichten und stattdessen Kindelemente notieren (ist aber eine persönliche Sache und somit nur eine Empfehlung).

Welche Probleme können mit Attributen entstehen

  • Attribute können nicht mehrere Werte enthalten (Elemente schon)
  • Attribute folgen keiner Baumstruktur (Elemente schon)
  • Attribute sind nicht so einfach zu spezifizieren (für zukünftige Änderungen)
  • Attribute sind schwieriger zu lesen und zu editieren

Man sollte Attribute am besten dazu nutzen Informationen zu transportieren, die nicht relevant sind für die Daten.

Absolutes NO GO:
<note day="10" month="01" year="2008" to="Tove" from="Jani" heading="Reminder" body="Don't forget me this weekend!"></note>
Das ist XML Horror.

Wozu brauche ich sie denn dann noch?

Ein sinnvoller Nutzen von Attributen und Attributwerten sind zum Beispiel ID-Vergaben an Elemente.
Das ist insofern nützlich, dass man eine laufende Nummer zu Einträgen hinzufügen kann, wenn es zum Beispiel um eine Personenliste geht und man einen Wert brauch, der auf jeden Fall frei von Redundanzen (Wiederholungen) bleiben muss.

Beispiel:

<namensliste>
<person id="0001">
<vorname>Karli</vorname>
<nachname>Knusper</nachname>
</person>
<person id="0002">
<vorname>Klausi</vorname>
<nachname>Knusper</nachname>
</namensliste>

Was das Beispiel deutlich macht ist, dass man nun eindeutiger zuweisen kann welches Element gemeint ist. Hat man eine endlose Datenbank mit endlos vielen Personen der Familie Knuspre, dann wird man sich darin totsuchen, bis man zu der Person gelangt, welche man nun sucht.
Da ist es doch viel einfacher die entsprechende ID zu suchen und somit direkt zu Person X zu gelangen.
Merke: Metadaten in das Element als Attribut notieren! Daten als neues Element notieren!

DTD

Jedes XML-Dokument sollte wohlgeformt (richtige Tag-Benennung, Verschachtelung… s. o.) und valide sein. Valide wird es erst durch die Referenzierung auf eine DTD (Doctyp definition). Dies ist eine Auflistung der möglichen Inhalte der XML-Datei und ihrer erlaubten Reihenfolge. Die DTD wird vom Erstersteller der XML-Datei miterstellt. Sie kann ebenfalls mit einem Texteditor geschrieben werden, muss aber die Endung .dtd beinhalten.

Aufbau einer DTD

Als Beispiel nehme ich das folgendes XML-Dokument:

<?xml version="1.0" encoding="utf-8" ?>
<root_element>
<child1>Inhalt1</child1>
<child1>Inhalt2</child1>
<child2>
<subchild1>SubInhalt1</subchild1>
<subchild2>SubInhalt2</subchild2>
<child2>
</root_element>

Die dazugehörgie DTD wäre:

<!ELEMENT root_element (child1+, child2)>
<!ELEMENT child1 (#PCDATA)>
<!ELEMENT child2 (subchild1, subchild2)>
<!ELEMENT subchild1 (#PCDATA)>
<!ELEMENT subchild2 (#PCDATA)>

Bedeutung: ist gibt ein Element mit dem Namen root_element, das ein oder mehr (+) Elemente child1 und ein Element child2 enthalten darf. child1 darf wiederum PCDATA (Parced character data = Buchstaben, Ziffern…) enthalten. child2 enthält zwei weitere Elemente jeweils ein mal. Gleiches PCDADA dann für die subchilds.

Folgende Befehle stehen noch zur Verfügung:

  • | für das Eine oder Andere
  • * für nichts, 1 oder viele Element
  • ? für 0 oder einmal
  • + für 1 oder mehrmals

Stimmt die XML-Datei nicht mit der zugehörigen DTD überein (z. B. 2 x child2 in diesem Fall), dann ist sie nicht valide und je nach Browser wird ein Fehler geworfen.

Einbindung einer DTD

Eine DTD kann entweder direkt in die XML-Datei eingebunden werden (hier der DTD mit dem Namen testdatei):

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE testdatei [
<!ELEMENT root_element (child1+, child2)>… usw.
]>
<root_element>… usw.

Oder ausgelagert in eine extra Datei mit der Endung .dtd eingebunden werden:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE testdatei SYSTEM="testdoctype.dtd">
<root_element>… usw.
Bewertung: 
4.47619
Durchschnitt: 4.5 (21 Stimmen)