XML Attribute

Attribute sind zusätzliche Informationen zu Elementen. Sie können beispielsweise so aussehen:

<img src="meinBild.jpg"
\ alt="bild" heigth="12" width="150"/>
<person sex="m">
<name>der Weihnachtsmann</name>
</person>

Man kann hier schon sehen, daß es wohl nichts gibt, was man mit Attributen machen kann, das man mit Elementen nicht auch gekonnt hätte. Das <img>-Element könnte genausogut so aussehen:

<img>
<src>meinBild</src>
<alt>"bild"</alt>
<height>12</height>
<width>150</width>
</img>

Betrachtet also Attribute am Besten als ein Gestaltungsmittel für eure Dokumente. Eine Besonderheit haben Attribute allerdings: ihre Reihenfolge ist unbestimmt, das heißt die beiden folgenden Zeilen sind aus XML-Sicht völlig identisch:

<img src="meinBild" alt="bild">
<img alt="bild" src="meinBild">

Einige Regeln gibt es für Attribute noch zu beachten:

  • Ein Attributname darf nicht mehrmals im gleichen Element benutzt werden.
  • Ein Attributwert darf kein Verweis auf ein externes Entity enthalten. Jaja, ich weiß ja, daß ihr garnicht wißt, was ein externes Entity ist. Habt noch etwas Geduld, ich werds später erklären.
  • In einem Attributwert darf kein < vorkommen.

Wie kann man nun Attribute in der DTD definieren? Das ist keine große Hürde (ich hoffe zumindest, daß es das für euch nicht ist).

<!ATTLIST img src    CDATA #REQUIRED
alt CDATA #REQUIRED
height CDATA #IMPLIED
width CDATA #IMPLIED
>

Was bedeutet das nun im einzelnen? ATTLIST img sagt nur aus, daß es sich im Folgenden um eine Attributliste zum Element img handelt. Danach werden die einzelnen Attribute aufgelistet (wenn man nur ein Attribut haben will, heißt es trotzdem ATTLIST), und zwar zuerst der Name des Attributes, dann der Typ (in diesem Fall CDATA, also Zeichendaten). Zum Schluss folgt noch ein Modifikator, der angibt, ob das Attribut erforderlich ist (#REQUIRED), oder optional (#IMPLIED). Es gibt noch eine dritte Möglichkeit für den Modifikator: #FIXED.

<!ATTLIST steuern comment CDATA #FIXED "zu hoch"> 

Das bedeutet also, daß zum Element <steuern> ein Attribut comment definiert wird, das immer den Wert "zu hoch" hat. Im XML-Dokument kann das Attribut ausgeschrieben werden, muß aber nicht. Wenn comment mit einem anderen Wert belegt wird, resultiert daraus ein Fehler.

<steuern comment="zu hoch"/>
<steuern/>                     <!--entspricht der ersten Zeile-->
<steuern comment="zu niedrig"> <!--Fehler-->

Wenn man keinen Modifikator angibt, muß man eine Vorgabe für den Attributwert machen. Diese wird dann benutzt, falls das Attribut im XML-Dokument nicht gesetzt wird.

<!ATTLIST fenster material "glas">

Dies würde also bedeuten, daß wenn man folgende Zeile schreibt, das Attribut material den Attributwert glas hat:

<fenster/>
<fenster material="kunststoff"/> <!--das Attribut wird anders belegt-->

An dieser Stelle möchte ich jetzt näher auf die Attributtypen eingehen. Es gibt 10 Stück davon. Das ist weniger, als es sich auf den ersten Blick anhört (hä? auf den ersten Blick anhört??), wie ihr gleich sehen werdet.

CDATA beliebige Zeichenketten
ID Die ID muß im gesamten Dokument einmalig sein, damit jede ID eindeutig ein Element identifiziert. Deshalb kann eine ID nur #REQUIRED oder #IMPLIED sein.
IDREF IDREF muß eine Zeichenkette sein, die irgendwo im Dokument eine ID ist, also quasi auf diese verweisen. Mit ID und IDREF können also zwei unterschiedliche Elemente einander zugeordnet werden.
IDREFS Eine Liste von Referenzen. Als Trennzeichen fungiert das Leerzeichen.
ENTITY Der Attributwert muß mit dem Namen einer externen, ungeparsten Entity übereinstimmen.
ENTITIES Eine Liste. Als Trennzeichen fungiert - oh Wunder - das Leerzeichen.
NMTOKEN Entpricht CDATA mit ein paar Einschränkungen:
  • darf nur mit A-Z, a-z, 0-9 oder _ anfangen, danach sind auch ".", "-", "," (sieht irgendwie kryptisch aus, gelle?) erlaubt
  • es dürfen keine Leerzeichen oder Markup enthalten sein
  • darf nicht mit xml anfangen, egal ob groß oder klein
NMTOKENS Ratet mal. Genau. Aufzählung mit Trennzeichen Leerzeichen.
NOTATION Der Wert eines Attributs vom Typ NOTATION, ist der Name einer Notation. Was Notationen sind, dazu später mehr.
NOTATIONS nochmal schreib ich das nicht…

Eigentlich gibt es noch einen elften Attributtyp, wenn man das denn so nennen will, nämlich den Aufzählungstyp. Dieser hat allerdings kein Schlüsselwort (wie CDATA), und kommt mit einer anderen Syntax daher:

<!ATTLIST person sex (m | w | transsexuell) #REQUIRED>

Hier kann das Attribut sex nur die Werte m, w oder transsexuell annehmen.

So, das war es eigentlich, was es zu den Attributen zu sagen gibt. Wenn ihr XML bis hierher beherrscht, dann beherrscht ihr den größten Teil von XML (das soll euch aber auf keinen Fall abhalten, auch noch die anderen Kapitel zu lesen!).

Wiederholung ist die Mutter der Weisheit, wie man so sagt, und deshalb jetzt noch ein abschließendes Beispiel. Zuerst die DTD:

<!ELEMENT bibliothek (buch)+>

<!ELEMENT buch (titel, autor, inhalt)>
<!ATTLIST buch genre (Sachbuch | Roman | Fantasy) "Sachbuch"
verlag CDATA #FIXED "meinVerlag"
isbn ID #REQUIRED
neuauflageVon IDREF "null"
>

<!ELEMENT titel (#PCDATA)>

<!ELEMENT autor (#PCDATA)>
<!ATTLIST autor geschlecht (m | w) #REQUIRED>

<!ELEMENT inhalt (#PCDATA)>

Das sollte euch nach der Lektüre diesen Kapitels eigentlich verständlich sein. Eine Anmerkung zu den Attributen isbn und neuauflageVon möchte ich trotzdem noch machen: Jedem Buch wird hier ein eindeutiger Schlüssel zugewiesen, nämlich seine ISBN. Dabei wird angenommen, daß in dieser (zugegebener Maßen etwas merkwürdigen) Bibliothek jeweils nur EIN Exemplar eines Buches steht, und deshalb ISBN's nicht doppelt vorkommen. Das Attribut neuauflageVon kann sich dann eindeutig auf eine ISBN beziehen. Sollte dieses Attribut nicht gesetzt werden, beispielsweise weil es die Erstauflage ist, ist der Defaultwert null. null hat keine besondere Bedeutung (bzw. ist kein von XML reserviertes Wort), und muß dann von der Anwendung entsprechend interpretiert werden.

Eine Instanz dieser DTD könnte etwa so aussehen:

<?xml version="1.0"?>
<!DOCTYPE bibliothek SYSTEM "bibliothek.dtd">

<bibliothek>
<buch genre="Fantasy" isbn="3-608-95855-X">
<titel>Der Herr der Ringe</titel>
<autor geschlecht="m">J.R.R. Tolkien</autor>
<inhalt>viel Text</inhalt>
</buch>

<buch isbn="3-8273-1330-9">
<titel>XML in der Praxis</titel>
<autor geschlecht="m">Behme, Mintert</autor>
<inhalt>Inhalt</inhalt>
</buch>

<buch genre="Fantasy" isbn="5559110815" neuauflageVon="3-608-95855-X">
<titel>Der Herr der Ringe</titel>
<autor geschlecht="m">J.R.R. Tolkien</autor>
<inhalt>vielText</inhalt>
</buch>
</bibliothek>

zurück                weiter

nach oben