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>
X

Fehler melden

X

Suche