DTDs und XSDs verstehen – Teil 1

15.07.2006 von Martin Kuppinger
Die Struktur von XML-Dokumenten wird in Form von DTD (Document Type Definitions) oder XSDs (XML Schema Definitions) beschrieben. Der Artikel erläutert anhand der entsprechenden Definitionen bei Lotus Domino die Funktionsweise der DTD-Dokumente, mit der man für die Nutzung von XML bei Domino vertraut sein sollte.

XML hat als Basis für die Beschreibung von Dokumenten inzwischen eine große Bedeutung erlangt. Allerdings ist XML nur die Basis, auf die für Dokumente aufgesetzt werden kann. DXL als die von Lotus Domino verwendete XML-Variante definiert beispielsweise eine Vielzahl von speziellen Elementen und Attributen, die für die Beschreibung von Notes-Dokumenten, Gestaltungselementen und ACLs benötigt werden. SPML beschreibt Informationen über Änderungen an Benutzern. SAML beschreibt Zuordnungen von Berechtigungen und Rollen, die im Rahmen der Federation benötigt werden – um nur einige Beispiele zu nennen.

DTDs und XSDs sind Beschreibungen des Inhalts und Aufbaus von XML-Dokumenten. Sie werden einerseits benötigt, damit verschiedene Kommunikationspartner die XML-Dokumente in der richtigen Form aufbauen können. Sie sind aber auch erforderlich, damit ein System automatisch prüfen kann, ob ein XML-Dokument die richtige Form hat.

Elemente eines XML-Dokuments

Jedes XML-Dokument besteht aus einem oder mehreren Elementen. Jedes Element hat einen Typ, wird durch einen Namen identifiziert und kann ein oder mehrere Attribute haben. Jedes Attribut hat einen Namen und belegt einen Wert. Elemente können geschachtelt werden.

DTDs bestehen wiederum aus vier Gruppen von Einträgen:

Die Strukturen von DTDs sind, wenn man mit XML etwas vertraut ist, relativ leicht nachvollziehbar. Die oberste Ebene bilden Elemente. Ein Beispiel ist

<!ELEMENT databaseinfo ( datamodified?, designmodified?,
created?, modified? )>

Das Element databaseinfo besteht seinerseits aus den vier Elementen

Die Sonderzeichen haben eine spezielle Bedeutung. Das Komma zwischen den Elementen bedeutet, dass diese in der angegebenen Reihenfolge vorkommen müssen. Eine andere Variante ist der senkrechte Strich |. Das würde heißen, dass eines der Elemente gewählt werden kann. Das Fragezeichen hinter den Elementen gibt an, dass das Element 0 oder 1 Mal vorkommen darf.Daneben gibt es

Attributlisten

Zu den Elementen können Attributlisten zugeordnet werden, die weitere Informationen zu den Elementen enthalten. Ein Beispiel:

<!ATTLIST databaseinfo
dbid %dbid; #IMPLIED
replicaid %replicaid; #IMPLIED
odsversion %integer; #IMPLIED
diskspace %integer; #IMPLIED
numberofdocuments %integer; #IMPLIED
percentused %float; #IMPLIED
>

Bei den Attributen werden neben dem Namen zwingend der Datentyp und optional eine Information dazu angegeben, ob der Wert erforderlich ist. Im Beispiel wird für die Datentypen mit einem Makro gearbeitet, das auf eine Definition in einem anderen Bereich der DTD verweist. Solche Makros werden relativ häufig in größeren DTDs eingesetzt, um die Übersichtlichkeit zu erhöhen. Darauf werden wir im Zusammenhang mit den Entities noch eingehen.

Der Text #IMPLIED gibt an, dass es sich um ein optionales Attribut handelt. Die Anwendung hat einen Standardwert dafür, der eingesetzt wird – in den meisten Fällen 0 oder eine leere Zeichenkette. Mit #REQUIRED wird festgelegt, dass ein Wert angegeben werden muss. Eine weitere Optionist #FIXED text, mit der ein Standardwert angegeben werden kann. Falls das Dokument einen Wert enthält, muss dieser mit diesem Standardwert übereinstimmen. Wenn nur ein Text ohne #FIXED angegeben wird, kann dieser Standardwert durch einen anderen Wert im Dokument überschrieben werden.

Komplexe DTDs

Nun kommt es gerade in komplexeren DTDs vor, dass immer wieder die gleichen Teilelemente benötigt werden. Würde man diese jeweils komplett beschreiben, wäre die DTD noch deutlich länger, als sie in solchen Fällen ohnehin wird. Daher können Entities zur Beschreibung von Informationen verwendet werden. Der häufigste Einsatz ist die Definition von Makros, beispielsweise bei

<!ENTITY % note.types "
note |
document |
profiledocument |
%design.elements;
">'

In diesem Fall wird ein Element definiert. Dieses Element besteht aus mehreren anderen Elementen, von denen eines vorkommen muss. Innerhalb wird wiederum mit einem Makro gearbeitet, weil die Designelemente an anderer Stelle definiert sind.

Genutzt wird das beispielsweise bei

<!ELEMENT database ( databaseinfo?, acl?, fulltextsettings?,
launchsettings?, ( %note.types; )* )>

Stattdessen könnte der Eintrag auch die Form

<!ELEMENT database ( databaseinfo?, acl?, fulltextsettings?,
launchsettings?, ( note | document | profiledocument
| %design.elements )* )>

haben. Da %design.elements wiederum ein Platzhalter ist, gibt es auch dafür eine Entity-Definition, in diesem Fall lautet sie:

<!ENTITY % design.elements "
form |
subform |
page |
frameset |
view |
folder |
sharedfield |
sharedactions |
imageresource |
appletresource |
agent |
agentdata |
scriptlibrary |
databasescript |
helpusingdocument |
helpaboutdocument |
dataconnection
">

Einbindung

Würde man das noch in die Beschreibung desElements Datenbank einbinden, so würde die Darstellung doch ziemlich unübersichtlich:

<!ELEMENT database ( databaseinfo?, acl?, fulltextsettings?,
launchsettings?, ( note | document | profiledocument
| (form | subform | page | frameset |
view | folder | sharedfield | sharedactions | imageresource
| appletresource | agent | agentdata |
scriptlibrary | databasescript | helpusingdocument |
helpaboutdocument | dataconnection))* )>

Entities lassen sich auch dazu nutzen, aktuelle Zeichenketten als Platzhalter einzubinden, wennes Werte gibt, die sich je nach Nutzung einer DTD verändern.

Zum Schluss seien noch die Kommentare genannt. Für die weiter oben erläuterte Attributliste sieht der Kommentar in der Domino DTD beispielsweise so aus:

<!-- Attributes for <databaseinfo>:
replicaid: DEPRECATED, you should now
get replicaid from root element attributes
odsversion: Major version
diskspace: used disk space in bytes
numberofdocuments:
in the database
percentused: percent of spaced used by the
database (numberOfbytesAllocated/dbsize)*100
-->

Bei Kommentaren sind nur die ersten vier und die letzten drei Zeichen von Bedeutung, die den Kommentar einschließen. Innerhalb des Kommentars können beliebige Informationen genutzt werden.

Die Standards

Die Standards für den Aufbau von DTDs und XSDs wurden vom W3C (World Wide Web Consortium) definiert. Informationen zu DTDs stehen unter www.w3c.org/TR/REC-xml, Information zum XML Schema unter www.w3c.org/XML/schema zur Verfügung.