Ausblick - XML-Schema
Grenzen von Dokumenttypdefinitionen
Dokumenttypdefinitionen können die Inhalte von Elementen nur recht grob beschreiben. Schauen wir uns zur Verdeutlichung das Beispiel der Schachspielzustände an.
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE Schach-Spielzustand SYSTEM "schach1.dtd">
<Schach-Spielzustand>
<schwarz>
<Bauer>b7</Bauer>
<Bauer>e7</Bauer>
<Bauer>d6</Bauer>
<Bauer>b5</Bauer>
<Bauer>f4<Bauer>
<Springer>c6</Springer>
<Läufer>e5</Läufer>
<Dame>c4</Dame>
<König>d7</König>
</schwarz>
<weiss>
<Bauer>h5</Bauer>
<Bauer>f2</Bauer>
<Bauer>g2</Bauer>
<Turm>f1</Turm>
<Läufer>f5</Läufer>
<Dame>f7</Dame>
<König>g1</König>
<amZug/>
</weiss>
</Schach-Spielzustand>
Die folgende DTD legt fest, wie Schachspielzustände dargestellt werden.
<!ELEMENT Schach-Spielzustand (schwarz, weiss)>
<!ELEMENT schwarz (Bauer*, Turm*, Springer*, Läufer*, Dame*, König, amZug?)>
<!ELEMENT weiss (Bauer*, Turm*, Springer*, Läufer*, Dame*, König, amZug?)>
<!ELEMENT Bauer (#PCDATA)>
<!ELEMENT Turm (#PCDATA)>
<!ELEMENT Springer (#PCDATA)>
<!ELEMENT Läufer (#PCDATA)>
<!ELEMENT Dame (#PCDATA)>
<!ELEMENT König (#PCDATA)>
<!ELEMENT amZug EMPTY>
Diese DTD legt zwar fest, dass mehrere schwarze und weiße Bauern auf dem Spielfeld stehen können. Sie legt aber
nicht fest, dass es maximal acht schwarze und acht
weiße Bauern geben kann. Die DTD legt auch nicht fest, dass nur bestimmte Spielfeldbezeichnungen wie b7
erlaubt sind, während andere wie z11
nicht vorkommen dürfen.
Ein neuer Ansatz
Diese unzureichenden Möglichkeiten, den Dokumenttyp genau zu beschreiben, ist einer der Gründe, weshalb man eine alternative Möglichkeit zur Festlegung von Dokumenttypen entwickelt hat: XML-Schema. Wir werden hier nicht weiter auf die Grundlagen von XML-Schema eingehen. Im Folgenden soll nur exemplarisch eine solche Schema-Deklaration gezeigt werden.
Die Einbindung des XML-Schemas erfolgt im Wurzelelement.
<?xml version="1.0" encoding="iso-8859-1"?>
<Schach-Spielzustand
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schach.xsd">
<schwarz>
<Bauer>b7</Bauer>
<Bauer>e7</Bauer>
<Bauer>d6</Bauer>
<Bauer>b5</Bauer>
<Bauer>f4<Bauer>
<Springer>c6</Springer>
<Läufer>e5</Läufer>
<Dame>c4</Dame>
<König>d7</König>
</schwarz>
<weiss>
<Bauer>h5</Bauer>
<Bauer>f2</Bauer>
<Bauer>g2</Bauer>
<Läufer>f5</Läufer>
<Turm>f1</Turm>
<Dame>f7</Dame>
<König>g1</König>
<amZug/>
</weiss>
</Schach-Spielzustand>
Das XML-Schema selbst wird - ebenfalls als XML-Dokument - in einer eigenen Datei deklariert. Der Aufbau wirkt auf den ersten Blick recht kompliziert. Bei einer genaueren Analyse kann man aber die wesentlichen Strukturen wiedererkennen. Insbesondere kann man die Stellen finden, in denen die oben genannten Einschränkungen (maximal 8 Bauern, korrekte Spielfeldbezeichnungen) festgelegt sind.
<?xml version="1.0" encoding="iso-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="Schach-Spielzustand">
<xs:annotation>
<xs:documentation>Spielbrett während eines Schachspiels</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="schwarz" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="Bauer" minOccurs="0" maxOccurs="8">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-h][1-8]"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Turm" minOccurs="0" maxOccurs="10">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-h][1-8]"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Springer" minOccurs="0" maxOccurs="10">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-h][1-8]"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Läufer" minOccurs="0" maxOccurs="10">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-h][1-8]"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Dame" minOccurs="0" maxOccurs="9">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-h][1-8]"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="König" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-h][1-8]"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="amZug" minOccurs="0" maxOccurs="1"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="weiss" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="Bauer" minOccurs="0" maxOccurs="8">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-h][1-8]"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Turm" minOccurs="0" maxOccurs="10">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-h][1-8]"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Springer" minOccurs="0" maxOccurs="10">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-h][1-8]"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Läufer" minOccurs="0" maxOccurs="10">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-h][1-8]"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Dame" minOccurs="0" maxOccurs="9">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-h][1-8]"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="König" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-h][1-8]"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="amZug" minOccurs="0" maxOccurs="1"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>