XML-Know How

Deklaration von Elementen in XSD

Das folgende Beispiel eines einfachen XML-Dokuments mit DTD und entsprechender XSD zeigt das Grundprinzip von XSD als Validierungssprache:

artikel.xml

<?xml version="1.0"?>
    <artikel>
       <titel>Der Titel</titel>
       <teaser>Der Teaser</teaser>
       <inhalt>Der Inhalt</inhalt>
</artikel>

artikel.dtd

<!ELEMENT artikel (titel, teaser, inhalt)>
<!ELEMENT titel (#PCDATA)>
<!ELEMENT teaser (#PCDATA)>
<!ELEMENT inhalt (#PCDATA)>

artikel.xsd

<?xml version="1.0"encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="artikel">
    <xs:complexType>
       <xs:sequence>
         <xs:element name="titel" type="xs:string"/>
         <xs:element name="teaser" type="xs:string"/>
         <xs:element name="inhalt" type="xs:string"/>
       </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Das <xs:schema>-Element umschließt das gesamte XSD-Schema. Es ist das Root-Element des Schemas.

Mit dem XSD-Element <xs:element> werden die Elemente des XML-Dokuments deklariert, im Beispiel das Root-Element <artikel> sowie die Unterelemente <titel>, <teaser> und <inhalt>:

<xs:element name="artikel">
...
         <xs:element name="titel" type="xs:string"/>
         <xs:element name="teaser" type="xs:string"/>
         <xs:element name="inhalt" type="xs:string"/>
...
</xs:element>

Der Name des deklarierten Elements steht dabei im name-Attribut.

Das Element <artikel> ist ein Element mit mehreren Unterelementen. Auch das muss im XSD angegeben werden. Dafür sorgt das in der Hierarchie folgende Element <xs:complexType>:

<xs:element name="artikel">
    <xs:complexType>
...
    </xs:complexType>
</xs:element>

In der XSD-Terminologie ist jedes Element, das weitere Elemente enthält oder Attribute hat, ein <complexType>. Alle anderen Elemente gelten als <simpleType>.

<xs:sequence> als weiteres XSD-Element innerhalb von <xs:complexType> gibt an, welche Reihenfolge die Unterelemente von <artikel> haben sollen. In unserem Beispiel ist das eine genaue Folge (sequence):

<xs:element name="artikel">
    <xs:complexType>
       <xs:sequence>
         ...
       </xs:sequence>
    </xs:complexType>
  </xs:element>

Innerhalb des <xs:sequence>-Elements erfolgt nun endlich die Deklaration der Unterelemente von <artikel>, also <titel>, <teaser> und <inhalt>:

<xs:element name="artikel">
    <xs:complexType>
       <xs:sequence>
         <xs:element name="titel" type="xs:string"/>
         <xs:element name="teaser" type="xs:string"/>
         <xs:element name="inhalt" type="xs:string"/>
       </xs:sequence>
    </xs:complexType>
  </xs:element>

Da es sich bei <titel>, <teaser> und <inhalt> um einfache Elemente, also Elemente ohne Kindelemente oder Attribute handelt, erhalten sie keine detaillierte Typangabe durch <xs:complexType>. Bei ihnen erfolgt die Typangabe über das type-Attribut. Der Datentyp dieser Elemente ist »xs:string«, also eine Zeichenkette.

Das XSD-Element <xs:simpleType> wird bei einfachen Elementen nur dann verwendet, wenn sie genauer definiert werden sollen als es über das type-Attribut möglich ist; mehr dazu siehe weiter unten im Abschnitt Benutzerdefinierte Datentypen in XSD.