Entities

(Auszug aus "Perl & XML" von Erik T. Ray & Jason McIntosh)

Um dem XML-Autor seine Arbeit zu erleichtern, gibt es ein anderes nützliches Feature von XML, die sogenannten Entities . Ein Entity kann man zum Beispiel als Platzhalter für Text einsetzen, der später ersetzt werden soll, der immer wieder vorkommt oder der schwer einzugeben ist. Das Entity ist ein Stück XML, das gewissermaßen außerhalb des Dokuments steht. (Anmerkung: Man kann das gesamte Dokument als ein Entity ansehen, das dann als Dokumententity bezeichnet wird. Im allgemeinen Sprachgebrauch hat sich »Entity« aber eher für eine Teilmenge des Dokuments durchgesetzt.) Um den Wert des Entity in das Dokument einzufügen, benutzt man eine Entityreferenz . Ein XML-Prozessor hat die Aufgabe, alle Entityreferenzen aufzulösen und durch den definierten Wert zu ersetzen, während er das Dokument liest. Deshalb muß ein referenziertes Entity auch irgendwo deklariert sein, damit der Prozessor weiß, welchen Wert er einzusetzen hat.

Die Deklaration eines Entity geschieht in der Document Type Definition (DTD). Die DTD besteht aus zwei Teilen: Der interne Bereich ist ein Teil Ihres Dokuments. Der externe Bereich steht dagegen in einem anderen Dokument. Wenn im Gespräch von »der DTD« die Rede ist, dann ist meistens der externe Bereich gemeint, obwohl die DTD aus beiden Teilen besteht. Die Deklaration des Entity ist aber nicht davon abhängig, wo sie geschieht. Das Dokument im folgenden Beispiel zeigt, wie man Entities verwendet.

Beispiel: Ein Dokument mit Entitydeklarationen und -referenzen

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE memo
SYSTEM "/xml-dtds/memo.dtd"
[
<!ENTITY firmenname "Siggi Sauers Schokoladenfabrik">
<!ENTITY krankenkasse SYSTEM "kk.txt">
]>

<memo>
  <to>An alle Sauer-Mitarbeiter</to>
  <para>
    &firmenname; hat einen neuen Eigentümer und Vorstandsvorsitzenden, nämlich Konrad
    Korb. Da unser Markenname "&firmenname;" gut bekannt ist, soll er bewu&szlig;t so
    bleiben, wie er ist. Allerdings empfiehlt Hr. Korb dringend, die Konditionen der
    Betriebskrankenkasse zu überarbeiten. Details über die neuen Konditionen finden Sie
    im folgenden Text. Hr. Sauer lä&szlig;t allen Mitarbeitern seinen Dank für die
    langjährige Treue ausrichten und wünscht dem neuen Vorsitzenden und der Firma
    &firmenname; alles Gute!
  </para>
  &krankenkasse;
</memo>

Schauen wir uns die in diesem Beispiel enthaltenen Neuigkeiten etwas näher an. Es beginnt mit der DTD, einer speziellen Markup-Anweisung, die eine Unmenge nützlicher Informationen enthält, darunter den internen Bereich und den Pfad zum externen Bereich. Alle Deklarationen (d. h. alle Anweisungen, die etwas Neues definieren) beginnen mit einem Ausrufezeichen, gefolgt von einem Schlüsselwort, in diesem Fall DOCTYPE. Nach diesem Schlüsselwort kommt der Name des Elements, in dem das eigentliche Dokument enthalten ist. Wir nennen dieses Element das Wurzelelement oder auch das Dokumentelement . Auf den Elementnamen folgt der Pfad des externen Bereichs, nämlich SYSTEM "/xml-dtds/memo.dtd". In eckigen Klammern ([ ]) folgt der interne Bereich.

Man verwendet normalerweise den externen Bereich für Deklarationen, die in mehreren Dokumenten verwendet werden, so daß es also eine naheliegende Idee ist, diese in eine externe Datei auszulagern. Der interne Bereich enthält dagegen Deklarationen, die nur in diesem speziellen Dokument gelten sollen. Er kann neue Deklarationen enthalten, aber auch existierende aus dem externen Bereich überschreiben. In unserem Beispiel enthält der interne Bereich zwei Entitydeklarationen: firmenname und krankenkasse. Eine solche Deklaration benötigt zwei Parameter: den Entitynamen und den für die Entityreferenz einzusetzenden Text.

Entities dieser Art heißen allgemeine Entities, und man unterscheidet sie von anderen Entityarten, weil sie von Ihnen, dem Autor des XML-Dokuments, deklariert wurden. Der Ersetzungstext eines allgemeinen Entity kann aus zwei verschiedenen Quellen stammen. Die erste Entitydeklaration im Beispiel gibt den Text als Teil der Deklaration direkt an. Die zweite dagegen gibt eine Datei an, aus der der Text zu lesen ist. Die Deklaration benutzt einen Systembezeichner ( System Identifier), um den Pfad anzugeben; ähnlich einer URL, die einem Browser angibt, von wo er die anzuzeigende Seite laden soll. In diesem Fall wird die Datei automatisch durch den XML-Prozessor geladen und an der Stelle eingefügt, an der sie durch die Entityreferenz angefordert wird. Man nennt dies ein externes Entity .

Wenn Sie das Beispiel genauer betrachten, werden Sie Markup-Anweisungen der Form &name; finden. Das Ampersand (&) bezeichnet eine Entityreferenz, während name das referenzierte Entity angibt. Man kann eine Referenz mehrere Male verwenden. Dadurch wird dies zu einer bequemen Möglichkeit, Textwiederholungen zu vermeiden. Im Beispiel tun wir das mit dem Entity firmenname.

Ein Entity kann wahlweise Text oder Markup enthalten, wie es im Falle des Entity krankenkasse geschieht. (Genauer gesagt, wissen wir nicht, was die Datei enthält. Aber dem Inhalt nach ist es eine größere Datei, also wird sie wahrscheinlich sowohl Markup als auch Text enthalten.) Ein Entity kann sogar andere Entities enthalten, die Verschachtelungstiefe ist beliebig. Es gibt nur eine Einschränkung: Entities können sich nicht selbst referenzieren, weder direkt noch indirekt. Eine zirkuläre Referenz könnte der XML-Prozessor nicht verarbeiten, weil sie einen niemals endenden Eingabestrom bedeuten würde. Es gibt zwar XML-Technologien wie XSLT, bei denen Sie sich nach Herzenslust mit rekursiver Logik austoben können, Entityreferenzen gehören aber eindeutig nicht dazu. Stellen Sie sich diese Referenzen vor wie irgendwelche Konstanten in einem Quelltext – auch hier würden Sie keinesfalls den Beifall Ihres Compilers ernten.

Es gibt im Beispieldokument eine weitere Entityreferenz, nämlich &szlig; – diese muß im externen Bereich deklariert sein. (Wir wollen uns an dieser Stelle einfach einmal vorstellen, das XML-Dokument sei mit einem Texteditor verfaßt, der Schwierigkeiten mit dem scharfen s (ß) hat.(Anmerkung: Und den Umstand ignorieren, daß er keine Probleme mit Umlauten hat. Im englischen Original ist dieses Beispiel erheblich naheliegender als in der deutschen Übersetzung. Andererseits muß man stets mit Problemen bei der Verwendung von deutschen Umlauten rechnen (und sei es nur, weil man das encoding="iso-8859-1" vergessen hat), insofern scheint es durchaus sinnvoll, kein anderes Beispiel zu konstruieren. – Anm. d. Ü.)) Da das referenzierte Entity nur ein einzelnes Zeichen einfügt, kann man in diesem Fall vielleicht eher von einem Alias sprechen. Der übliche Weg, mit ungewöhnlichen Zeichen umzugehen (der so auch in der XML-Spezifikation vorgesehen ist), liegt in der Verwendung eines numerischen Zeichenentity. In diesem Fall wäre das &#x00DF;. 0x00DF ist das hexadezimale Äquivalent der Zahl 223. Dies ist der Code des scharfen s in Unicode (dem hauseigenen Zeichensatz von XML, mit dem wir uns in Unicode, Zeichensätze und Codierungen noch genauer beschäftigen werden).

Da man sich im allgemeinen an einen abgekürzten und beschreibenden Namen besser erinnert als an 00DF, bevorzugen viele XML-Benutzer die Verwendung solcher Aliasnamen, indem sie Deklarationen wie die folgende in ihre DTDs einfügen:

<!ENTITY % szlig &#x00DF;>

XML kennt darüber hinaus auch fünf festeingebaute Entityreferenzen, die Sie in der folgenden Tabelle finden. Dabei handelt es sich um keine wirklichen Referenzen, sondern eher um Escape-Sequenzen für die XML-Sonderzeichen.

Tabelle: Entityreferenzen, die in XML ohne Deklaration gültig sind

Zeichen Entity
< &lt;
> &gt;
& &amp;
" &quot;
' &apos;

Von Bedeutung sind dabei speziell &lt; und &amp;, die anderen findet man in der Praxis eher selten. Kein Parser würde zum Beispiel verstehen, wann das Zeichen < im Sinne des mathematischen »kleiner als« verwendet wird und wann es ein XML-Element einleitet. Statt dessen würde er stets das letztere annehmen und gegebenenfalls ein nicht wohlgeformtes Dokument anmahnen.

  

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Perl & XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2003 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Perl & XML" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de