Grundaufbau

Grundaufbau

Grundaufbau

Befassen wir uns jetzt mit dem Aufbau eines einfachen XML-Dokument. Dabei genügt es einen einfachen Texteditor zu benutzen.

	<?xml version="1.0" encoding="iso-8859-1" ?>
	<dokument>
  		<frage>Hallo, Welt?</frage>
  		<antwort>Hier ist die Welt</antwort>
	</dokument>

Wichtig hierbei ist das das Script als “dateiname.xml” abgespeichert wird. Die Anzeige kann von Browser zu Browser variieren. Die Zeile <?xml version=”1.0″ encoding=”iso-8859-1″ ?> ist der sogenannte Prolog. Der Prolog beinhaltet in der einfachen Form nur die Versionsnummer von XML und den Zeichensatz für eine Region. Zudem besteht eine Kleinschreibungspflicht im gesamten Tag. Nach dem Prolog folgt das Wurzelelement. Im Beispiel ist dies der Dokument-Tag. Das Wurzelelement umschließt den eigentlichen Inhalt und ist gleichzusetzen mit dem, aus HTML bekannten, body-Tag. Die Zeilen <frage> </frage> und <antwort> </antwort> sind der eigentliche Inhalt. Zum Schluss muss noch ein schließendes Dokument-Tag erscheinen. Bei umfangreichen Projekten sollte man den selbstdefinierten Tags geeignete Namen vergeben. Der, im Beispiel verwendete, Zeichencode kann auch Umlaute problemlos darstellen. In anderen Zeichencodes wird es zu Fehlermeldungen kommen und das XML-Dokument wird nicht angezeigt. Der Standardzeichencode ist utf-8.

Die wichtigsten Ländercodes

ISO-Standard Ländercode
utf-8 (Unicode) universeller Zeichensatz, weltweit
iso-8859-1 (Latin-1) Westeuropa, Lateinamerika
iso-8859-2 (Latin-2) Zentral- und Osteuropa
iso-8859-3 (Latin-3) Südosteuropa
iso-8859-4 (Latin-4) Skandinavien, Baltikum
iso-8859-5 Kyrillisch
iso-8859-6 Arabisch
iso-8859-7 Griechisch
iso-8859-8 Hebräisch
iso-8859-9 Türkisch
iso-8859-10 Lappländisch, Nordisch, Eskimosprachen
euc-jp oder shift_jis Japanisch

Sonderzeichen

Die Sonderzeichen kann man einfach wie bei HTML mit Entitäten (Zeichencodes) umschreiben. Die Tabelle für diese Codes findet ihr unter HTML/Sonderzeichen.

Planen einer Baumstruktur

Als Beispiel bauen wir uns eine Art Bücherregal in dem Bücher stehen. Zunächst muss festgelegt werden, welche Inhalte ein Buch hat.
Z.B.:

  1. Titel des Buches
  2. Autor
  3. Verlag
  4. Beschreibung
  5. Sprache

Das Skript kann wie folgt aussehen:

<?xml version="1.0" encoding="utf-8"?>
<regal>
	<buch>
		<titel>Die Nadel</titel>
		<autor>Ken Follett</autor>
		<verlag>Luebbe</verlag>
		<sprache>Deutsch</sprache>
	</buch>
	<buch>
		<titel>Die Waechter</titel>
		<autor>Johann-Christian Hanke</autor>
		<verlag>Luebbe</verlag>
		<beschreibung>Sie nennen sich der
 "Camel Club". Ihr exklusiver Verein besteht aus nur vier
Mitgliedern, und sie alle waren einmal Helden.
Doch ihr Land, für das sie ihr Leben aufs
Spiel setzten, hat sie vergessen.
Nun leben sie am Rande der Gesellschaft,
und sie sehen sich als Waechter.</beschreibung>
		<sprache>Deutsch</sprache>
	</buch>
	<buch>
		<titel>Das verlorene Symbol</titel>
		<autor>Dan Brown</autor>
		<verlag>Luebbe</verlag>
		<beschreibung>Washington, D.C.: In der
amerikanischen Hauptstadt liegt ein sorgsam gehuetetes Geheimnis
verborgen, und ein Mann ist bereit, dafuer zu toeten.
Doch dazu benoetigt er die Unterstuetzung eines Menschen,
 der ihm freiwillig niemals helfen
wuerde: Robert Langdon, Harvard-Professor und Experte
für die Entschlüsselung und Deutung
mysterioeser Symbole.</beschreibung>
		<sprache>Deutsch</sprache>
    <sprache>Englisch</sprache>
	</buch>
</regal>

Wir speichern das Skript unter den Namen regal.xml ab. Wenn wir die Datei nun mit einem Browser öffnen erscheint ein Art Verzeichnisbaum wie beim Windows-Explorer. Man kann nun die einzelnen Elemente auf und zu klappen. Da die XML-Datei keinem Regelregelsatz unterliegt redet man hier von einem “wohlgeformten Dokument” (well-formed).

Attribute

Attribute

Um euch die Attribute näher zu bringen, verwenden wir zunächst einen anderen Sachverhalt. Statt dem Bücherregal verwenden wir eine Produktdatenbank als Beispiel. Legen wir folgendes für die Struktur fest:

  • Produktname
  • Produktnummer
  • Hersteller
  • Preis

Bis hierhin sieht alles noch wie gewohnt aus. Aber jetzt kommen die Spezifikationen. Nun splitten wir das Element Hersteller in Firma und Ort auf. Der Ort ist aber nicht zwingend notwendig. Die nächste Besonderheit geben wir dem Preis.
Bei unserem Beispiel wollen wir 2 verschiedene Arten von Preisen darstellen:

  • Privatkunde (Endpreis)
  • Händler (60% des Endpreises)

Hier zeigt sich dass die Planung eines XML-Dokumentes viel gemeinsam hat mit einem Datenbankdesign! Als nächstes müssen wir uns überlegen wie wir unsere Elemente nennen. Das Wurzelelement heißt im Beispiel:

  • produkte

Darunter haben wir verschiedene “Posten“, d.h. verschiedene Produkte. Also wird das erste Unterelement

  • posten

Danach charakterisieren wir ein Produkt mit folgenden Elementen:

  • name (Produktname)
  • nr (Produktnummer)
  • hersteller (Hersteller des Produktes)
  • preis (hier werden Attribute eingefügt)

Das Element hersteller sollte noch in

  • firma (Firmenname)
  • ort (Firmensitz, optional)

gesplittet werden. Wer will kann jetzt eine Skizze anfertigen die alles veranschaulicht.

Attribute definieren

Das Prinzip der Attribute ist eigentlich schon aus HTML bekannt. Zum Beispiel um einen Absatz rechtsbündig auszurichten schreiben wir:

<p align="right"> Text</p>

In XML ist dies natürlich auch möglich, wir werden das für unser Element preis durchführen. Hierfür verwenden wir das Attribut kunde welches wiederum folgende Werte hat:

  • handel
  • privat

Hinterher soll man für die Preise für Privatkunden <preis kunde=”privat”> und für Preise für den Handel <preis kunde=”handel”> schreiben. Um Attribute zu definieren braucht man folgenden Syntax:

 <ATTLIST Tagname Attributname Typ #OPTION>

ATTLIST steht als Abkürzung für Attributliste. Danach wird der Tag- und der Attributname angegeben.Als nächstes folgt der Typ des Attributs, im Beispiel wird dies nach folgenden “Typ-Muster” aufgebaut:

  • (Wert1|Wert2|usw.)

Das “Typ-Muster” beinhaltet einfach eine Liste an Werten die das Attribut annehmen kann. #OPTION steht für die Erforderlichkeit des Attributs z.B. #REQUIRED und #IMPLIED. Für unser Beispiel muss es folgendermaßen heißen.

<!ATTLIST preis kunde (handel|privat) #REQUIRED>

Nun können wir auch unsere zwei Dateien erstellen:

<!ELEMENT produkte (posten+)>
<!ELEMENT posten (name,nr,hersteller,preis+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT nr (#PCDATA)>
<!ELEMENT hersteller (firma,ort?)>
<!ELEMENT firma (#PCDATA)>
<!ELEMENT ort (#PCDATA)>
<!ELEMENT preis (#PCDATA)>
<!ATTLIST preis kunde (handel|privat) #REQUIRED>

Dies wird als produkte.dtd gespeichert und Folgendes produkte.xml:

	<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE produkte SYSTEM "produkte.dtd">
<produkte>
	<posten>
		<name>Babypuppe</name>
		<nr>32945-38</nr>
		<hersteller>
			<firma>Spielesepp</firma>
			<ort>Wagenbach</ort>
		</hersteller>
		<preis kunde="privat">60</preis>
		<preis kunde="handel">40</preis>
	</posten>
	<posten>
		<name>Holz-Kasper</name>
		<nr>32945-41</nr>
		<hersteller>
			<firma>Spielesepp</firma>
			<ort>Wagenbach</ort>
		</hersteller>
		<preis kunde="privat">18</preis>
		<preis kunde="handel">12</preis>
	</posten>
	<posten>
		<name>Holzeisenbahn basic</name>
		<nr>32945-41</nr>
		<hersteller>
			<firma>Natura GmbH</firma>
		</hersteller>
		<preis kunde="privat">80</preis>
		<preis kunde="handel">60</preis>
	</posten>
</produkte>

Mehr zu Attributen

CDATA ist die Abkürzung für character data und bedeutet, dass der Wert eine beliebige Zeichenkette sein kann. Bei diesem Attributtyp sind alle Zeichen erlaubt sogar Leer- und Sonderzeichen. Es werden sogar sinnlose Attributwerte akzeptiert.
Ein weiteres Schlüsselwort ist NMTOKEN. Bei diesem Attributtyp kann man auch eine Zeichenfolge eingeben aber es sind nur noch bestimmte Zeichen erlaubt:

  • Buchstaben
  • Ziffern
  • Punkt (.) und Doppelpunkt (:)
  • Bindestrich (-) und Unterstrich (_)

Es gibt aber keine Möglichkeiten nur bestimmte Zeichen wie nur Zahlen oder nur Buchstaben zuzulassen. Ein weiterer #OPTION-Typ ist #IMPLIED, dies sorgt dafür das das Attribut optional ist.
Würden wir in unserer produkt.dtd von

<!ATTLIST preis kunde (handel|privat) #REQUIRED>

in

<!ATTLIST preis kunde (handel|privat) #IMPLIED>

ändern, so kann kunde entweder den Wert handel oder privat enthalten zudem dürfte es weggelassen werden. Enthält kunde einen anderen Wert, so würde eine Fehlermeldung bei validieren auftauchen. Es besteht auch die Möglichkeit einen Wert vorzugeben.
Nehmen wir einfach unsere dtd:

<!ATTLIST preis kunde (handel|privat) #REQUIRED>

und ändern wir nun die vorherige Zeile in

<!ATTLIST preis kunde (handel|privat) "handel">

um. Wenn wir in unserer XML-Datei das Attribut kunde weglassen so wird automatisch vom Browser das vorgegebene Attribut angelegt. Ansonsten wird das Attribut überschrieben. Wenn bei der gerade geänderten Zeile vor das “handel” noch die Option #FIXED schreibt, wird der dahinter stehende Wert fest eingestellt.