Sql-und-Xml - Home

Xml lernen

Entities: Definition und Verwendung

  • In Xml ist es möglich, sich eigene Entities zu definieren. Dies sind Ausdrücke, die mit & bzw % beginnen und mit ; enden. Html verwendet sie, um diverse Sonderzeichen zu definieren. In Html gibt es eine fest vorgegebene Menge dieser Entities, die - entsprechend des verwendeten Html-Standards - vom Browser verarbeitet werden müssen. Dieser analysiert den zwischen & und ; stehenden Ausdruck, ermittelt den zugehörigen Ersetzungstext und stellt diesen korrekt dar. In Xml können Entities selbst definiert werden und als eine Art Makro verwendet werden. Ferner lassen sich nicht nur zur Erstellungszeit bekannte Ausdrücke, sondern auch der Inhalt von Dateien einbinden, so daß der tatsächliche Ersetzungstext erst zur Aufrufzeit ermittelt wird. Die externen Dateien müssen keine vollständigen Xml-Dokumente sein, es genügt, wenn es sich um Xml-Fragmente oder um Text ohne Markup, also ohne <, > und & handelt. Da auch Xml-Fragmente zugelassen sind, können Protokolldaten bsp. von einem PHP-Script zeilenweise mit markierendem Markup in eine Textdatei geschrieben und in einer auf einem anderen Server liegendem Xml-Dokument mit Lesezugriff eingebunden werden.
  • Mit Entities ist es damit möglich, Definitionen in eigene Dateien auszulagern und diese für verschiedene Projekte zu verwenden. Ebenso können Texte, die an verschiedensten Stellen benötigt werden, in einer gemeinsam verwendeten DTD festgelegt werden, wobei die DTD nur Entity-Definitionen enthält und von verschiedenartigen DTD's, die unterschiedliche Elemente definieren, eingebunden werden. Die Entity-DTD enthält damit nur ENTITY-Deklarationen, jede der Element-DTD's definiert eine Parameter-Entity, mit der die Entity-DTD eingelesen und einmalig ausgeführt wird. Anschließend stehen die an einer einzigen Stelle definierten Makros in allen auf den verschiedenen Element-DTD's basierenden Xml-Dokumenten zur Verfügung.
  • Schematisch:
    Eine DTD, die nur globale Entities enthält
    und die bsp. für die Firma typisch sind
    DTD-Abt.1DTD-Abt.2DTD-Abt.3
    ↙↓↘↙↓↘↙↓↘
    XmlDocs-1XmlDocs-2XmlDocs-3
    Ein Beispiel hierzu finden Sie am Ende dieser Seite.
  • Vordefinierte Entities: Im Gegensatz zu Html gibt es nur sehr wenige vordefinierte Entities:
    &lt;		<
    &gt;		>
    &amp;		&
    &quot;		"
    &apos;		'
    Diese können jederzeit verwendet werden, jeder Xml-Parser muß diese Entities kennen.
  • Entity-Typen: Zunächst gibt es die Sonderklasse der Zeichenentities. Diese müssen nicht in der Document Type Definition festgelegt werden, sondern werden direkt im Content oder in Attributwerten von Elementen verwendet. Alle anderen Entities werden innerhalb einer DTD definiert. Man unterscheidet zwischen globalen Entities und Parameter-Entities. Globale Entities können, wie Zeichenentities, im Content und in Attributen verwendet werden und beginnen mit &, Parameter-Entities werden ausschließlich in externen Document-Type-Definitions verwendet und beginnen mit %. Auf das Sonderzeichen folgt der Name, dessen Abschluß mit ';' markiert wird. Dann gibt es interne Entities - bei diesen wird der Ersetzungstext sofort angegeben - und externe Entities: Um deren Ersetzungstext zu bestimmen, muß auf eine andere Ressource zugegriffen werden. Schließlich gibt es geparste und ungeparste Entities - erstere enthalten Text, Markup und evtl. weitere Entities, letztere werden ungeparst an die Anwendung übergeben. Ungeparste Entities stellen eine Möglichkeit dar, dem Xml-Dokument Binärdaten zuzuordnen, ohne daß diese nach den Markupzeichen <, > und & durchsucht wird.

Zeichenentities

  • &#169; = ©, also & + # + dreistellige Zahl erzeugt das zugehörige ASCII-Zeichen.
  • &#x00A9; = ©, also & + # + x + vierstelliger Unicode in der Hex-Schreibweise erzeugt das zugeordnete Unicode-Zeichen, in diesem Fall ebenso das Copyright-Zeichen.
  • Windows-Nutzer können die Unicode-Codierungen über die Zeichentabelle ermitteln. Dort wird die zu einem Zeichen gehörende Codierung angezeigt.

    Diese Techniken funktionieren auch in Html. Neu in Xml ist, daß die Dateien auch als UTF-8 oder UTF-16, also als Unicode, gespeichert werden können. Unterstützt das Eingabeprogramm (Notepad) Unicode-Tastatureingaben direkt, so können die Sonderzeichen direkt über die Tastatur eingegeben werden. In diesem Fall wird die am Datei-Anfang stehende Xml-Declaration ergänzt:
    <?xml version='1.0' encoding='UTF-8'?>
    Deshalb sind für Xml all jene aus Html bekannten Entities wie &auml; für ä, &uuml; für ü usw. nicht mehr notwendig. Es genügt eine Speicherung als UTF-8 sowie die direkte Verwendung.

Geparste Entities

  • Geparste interne Entities, definierbar innerhalb einer internen oder externen DTD, zu verwenden im Content von Elementen oder als Attributwert:
    <!ENTITY ENTITY-NAME "ERSETZUNGSTEXT">
    Beispiel:
    <!ENTITY myName "&#169; Max Mustermann">
    myName ist der selbstgewählte Name dieser Entity, der die üblichen Regeln für Namen erfüllen muß. Der folgende Ausdruck in Hochkommata ist der Ersetzungstext, der selbst Entities enthalten kann und der, nachdem er geparst wurde, schließlich ausgegeben wird. Die Verwendung ist wie bei Html, also &myName;.
  • Gesparste interne Parameter-Entity, nur definierbar innerhalb einer externen DTD, nur dort verwendbar:
    <!ENTITY % allowedElements "b u a">
    Parameter-Entities können verwendet werden, um bei großen DTD's wiederholt benötigte Ausdrücke durch Makros zu ersetzen. Verwendung: %allowedElements;
  • Gesparste externe Entities, definierbar in der internen oder externen DTD, verwendbar im Xml-Dokument. Diese ermöglichen das Einbinden von Fragmenten in Rahmen-Xml-Dokumente:
    <!ENTITY my-external-entity
    	SYSTEM "my-external-entity-sample.txt">
    Erstellen Sie sich eine Datei my-external-entity-sample.xml mit dem folgenden Inhalt:
    <?xml version='1.0' encoding='ISO-8859-1'?>
    <!DOCTYPE my-sample [
    	<!ENTITY my-external-entity SYSTEM
    		"my-external-entity-sample.txt">
    	<!ELEMENT my-sample (#PCDATA)>
    ]>
    <my-sample>&my-external-entity;</my-sample>
    Erstellen Sie zusätzlich eine Datei my-external-entity-sample.txt. In diese Textdatei notieren Sie beliebigen Text ohne Markup-Zeichen oder korrekte Xml-Fragmente. Öffnen Sie nun das Dokument my-external-entity-sample.xml bsp. mit einem Browser, der auf Wohlgeformtheit überprüft. Dann werden Sie beobachten, daß nicht die Entity, sondern sofort der Ersetzungstext aus der externen Datei angezeigt wird.
  • Ebenso können geparste externe Parameter-Entities in der externen DTD definiert und dort verwendet werden:
    <!ENTITY % xhtml-lat1
    	SYSTEM 'http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent'>
    
    %xhtml-lat1;
    Die erste Anweisung referenziert die offizielle Liste der lat1-Entities, diese enthält u.a. die Entity-Definitionen für die Namen der deutschen Umlaute, die in Html ohne zusätzliche Definition genutzt werden können. Die zweite Zeile verwendet diese Parameter-Entity einmal, so daß sämtliche in der externen Entity stehenden zusätzlichen Entity-Definitionen nun lokal zur Verfügung stehen.

Ungeparste externe Entities und NOTATION

Die folgenden Ausführungen folgen der Vollständigkeit halber, da sie zu Xml dazugehören. Für 'übliche Anwendungen' werden diese Kenntnisse nicht benötigt.
  • Will man zusätzliche Daten in das Xml-Dokument einbinden, die bsp. in Binärform (Bilder, Videos) vorliegen, so sieht Xml selbst keine Verarbeitungsmöglichkeit vor. Es muß jedoch möglich sein, den Typ der einzubindenden Daten mitzuteilen, so daß der Standard-Parser diese Informationen auf Korrektheit gegen die DTD prüft und die Daten an das aufrufende Rahmenprogramm weitergibt. Dafür dienen die Begriffe NOTATION und NDATA.
  • Beispiel:
    <!NOTATION myImage SYSTEM "image/gif">
    <!ENTITY myCoffee SYSTEM "Coffee-Bean.gif" NDATA myImage>
    <!ELEMENT my_picture EMPTY>
    <!ATTLIST my_picture thisLink ENTITY #REQUIRED>
    Die NOTATION-Definition ordnet dem innerhalb der DTD damit festgelegten Namen 'myImage' den innerhalb der aktuellen Umgebung identifizierbaren Bezeichner 'image/gif' zu. Ob dieser Bezeichner innerhalb der aktuellen Umgebung bekannt oder sinnvoll zugeordnet ist, wird nicht überprüft. Dann wird, wie im obigen Beispiel der eingebundenen Textdatei, eine Entity 'myCoffee' definiert. Diese verweist auf die Datei 'Coffee-Bean.gif', die nachfolgende NDATA teilt mit, daß es sich um eine nicht zu parsende Entity vom Typ 'myImage' handelt. Anschließend wird ein Element mit einem Attribut definiert, das Attribut ist vom Typ ENTITY und kann nun so verwendet werden:
    <my_picture thisLink="myCoffee"/>

Beispiel für die Kombination aus globalen, etwa firmenspezifischen Entities und Parameter-Entities zum Einbinden der globalen Entities in andere Dokumente:

  • Das Beispiel umfaßt drei Dateien. In der Datei max-mustermann-entity-definitions.dtd sind die firmentypischen Entities definiert. Diese Datei steht für alle Abteilungen nur mit Lesezugriff zur Verfügung:
    <!ENTITY unser-Firmenname "Firma Max Mustermann GmbH">
    <!ENTITY unsere-Anschrift "Musterstrasse 32, 12 000 Berlin">
    Jede Abteilung, hier die Abteilung-1, definiert sich eine Datei max-mustermann-abteilung-1.dtd
    <!ENTITY % max-mustermann-entity-definitions SYSTEM
    	"max-mustermann-entity-definitions.dtd">
    
    <!-- Weitere Definitionen, welche diese Abteilung nutzt -->
    
    <!-- Einmaliges Aufrufen der definierten Entity -->
    %max-mustermann-entity-definitions;
    Ein Dokument der Abteilung-1 kann nun wie folgt aussehen:
    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE abteilung-1 SYSTEM "max-mustermann-abteilung-1.dtd">
    
    <abteilung-1>
    
    	Herzlichen Glückwunsch, daß Sie sich zum Besuch der
    	&unser-Firmenname; entschieden haben.
    	Unsere Anschrift: &unser-Firmenname; &unsere-Anschrift;
    
    </abteilung-1>
    Damit der Aufruf des Beispiels funktioniert, müssen alle Dateien in einem Verzeichnis liegen, da alle Verweise relativ sind. Zur Verwendung können Sie natürlich die Datei max-mustermann-entity-definitions.dtd bsp. nach http://Ihr-Firmenserver/entities/ verschieben und den Verweis in der Datei max-mustermann-abteilung-1.dtd korrigieren auf
    <!ENTITY % max-mustermann-entity-definitions SYSTEM
     "http://Ihr-Firmenserver/ent/max-mustermann-entity-definitions.dtd">

© 2003-2017 Jürgen Auer, Berlin.