XML-Know How

Entities als Platzhalter für Nichttext-Dateien

Ebenso wie Text-Dateien können auch Nichttext-Dateien wie z. B. Grafiken durch Entities vertreten werden. Dabei ist aber eine weitere Information notwendig, nämlich die der Anwendung, die die Nichttext-Datei wiedergeben kann. Das plattformneutrale Konzept von XML sieht nämlich nicht vor, dass ein Computersystem z. B. durch die Endung des Dateinamens »von alleine« erkennt, ob die Nichttext-Datei eine Grafikdatei, eine Videodatei oder ein Tondokument ist.

Windows erkennt z. B. aus der Endung des Dateinamens bild.gif, dass diese Datei eine Grafikdatei des Typs GIF ist, und wird für die Anzeige dieser Datei ein Programm aufrufen, das die Datei anzeigen kann, z. B. einen Internet-Browser. Diese Funktionalität haben aber nicht notwendigerweise alle Betriebssysteme, so dass in XML eine separate Angabe des Dateiformats für Nichttext-Dateien vorgesehen ist.

Man muss also, bevor man eine Entity für eine Nichttext-Datei deklariert, das Dateiformat deklarieren. Das erfolgt durch eine sogenannte Notation. Ein Beispiel für das Dateiformat GIF:

<!NOTATION GIF SYSTEM "C:\Programme\Internet Explorer\IEXPLORE.EXE">

Die Notation ist genau wie eine Entity-Deklaration aufgebaut, nur dass sie mit !NOTATION eingeleitet wird und anstelle des Entitynamens eine frei wählbare Dateiformat-Kennung steht (in diesem Beispiel GIF).

Durch die Notation erfährt das Verarbeitungssystem, dass z. B. GIF-Dateien durch den Internet-Explorer dargestellt werden können.

Gerade bei Nichttext-Dateiformaten ist aber nicht immer sicher, dass das Wiedergabeprogramm auf dem Rechner verfügbar ist. Pfadangaben sind zudem nicht nur vom Betriebssystem abhängig, sondern auch von der konkreten Rechnerkonfiguration. Daher bietet sich hier statt der SYSTEM-Angabe ein PUBLIC-Identifier an, der die Institution oder die Firma angibt, die die Rechte an dem Dateiformat hält und bei der man am ehesten Informationen über dieses Format und Anwendungsprogramme erhalten kann (zum PUBLIC-Identifier s. oben den Abschnitt XML- und DOCTYPE-Deklaration). Für das Beispiel GIF-Dateien sieht die Notation mit PUBLIC-Identifier so aus:

<!NOTATION GIF PUBLIC "-//CompuServe//NOTATION Graphics Interchange Format//EN">

Wie bei der Entity-Deklaration für Dateien (siehe oben) sind auch hier Kombinationen von PUBLIC-Angabe und SYSTEM-Angabe möglich:

<!NOTATION GIF PUBLIC "-//CompuServe//NOTATION Graphics Interchange Format//EN" "iexplore.exe">

Ist erst einmal das Dateiformat GIF durch Notation definiert, kann eine Entity für eine GIF-Datei deklariert werden:

<!ENTITY bild1 SYSTEM "bild1.gif" NDATA GIF>

Zusätzlich zu der schon bekannten Angabe des Entitynamens (bild1) und der Datei (bild1.gif) per SYSTEM-Identifier kommt hinter dem Aufruf NDATA die Angabe der Dateiformat-Kennung, hier GIF (ohne Anführungszeichen). NDATA steht für non parsed data, das heißt, dass Daten dieses Typs nicht nach XML-Markup durchsucht werden (was bei Grafik- oder Audiodaten auch sinnlos wäre).

Im XML-Dokument werden nun die Entity und die Notation aufgerufen und zwar nicht in der Form &entity; wie bei Sonderzeichen oder Textdaten, sondern als Werte von Attributen:

<grafik name="bild1" typ="GIF"/>

Die beiden Attribute name und typ können wie alle Attribute frei benannt werden, allerdings müssen sie vom Typ ENTITY und NOTATION sein. Ihr Attributwert muss zudem einer in der DTD deklarierten Entity bzw. einer dort deklarierten Notation entsprechen, wie es in diesem Beispiel auch der Fall ist.

In der DTD werden diese Attribute so deklariert:

<!ATTLIST grafik
name ENTITY #REQUIRED
typ NOTATION #REQUIRED
>

Nur der Vollständigkeit halber sei erwähnt, dass es auch noch die Attributdatentypen ENTITIES und NOTATIONS gibt, bei denen wie etwa auch bei NMTOKENS-Attributen mehrere Angaben im Attributwert aufeinander folgen können.

Dieses Verfahren erscheint äußerst kompliziert, und in der Tat ist es zumindest recht umständlich. Bei den meisten XML-Anwendungen geht man deshalb den einfachen – aber nicht vom Standard gedeckten – Weg, den Dateinamen einer Nichttext-Datei als CDATA-Attribut eines leeren Elements anzugeben, ganz auf Entity-Deklaration und Notation zu verzichten und sich auf die Konfiguration des verwendeten Betriebssystems und der XML-Software zu verlassen:

<grafik dateiname="bild1.gif"/>