Attribute definieren

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.