Homepage-Webhilfe Event-Banner

Komplexe Typen

Neben den einfachen Typen gibt es in XSD auch noch komplexe Typen. Ein komplexer Datentyp kommt lediglich bei Elementen zum Einsatz und erlaubt es, Elemente mit untergeordneten Elementen oder einteilige Elemente zu definieren. Elemente, die Attribute besitzen, müssen ebenfalls als komplexe Typen definiert werden. Die Deklaration eines komplexen Typs erfolgt mit dem Element complexType. Der grundlegende Syntax unterscheidet sich nicht von der Deklaration eines einfachen Typs mittels simpleType. Die Notation eines anonymen komplexen Datentyps ist ebenfalls möglich.


Die einfachste Art eines komplexen Typs ist die Sequenz. Eine Sequenz besteht aus mehreren Elementen. Möchten Sie eine Sequenz definieren, so müssen Sie dem Element complexType ein sequence-Element unterordnen. Innerhalb des sequence-Elements werden dann die einzelnen Elemente angegeben (entweder direkt oder über eine Referenz).

XML-Datei:

<?xml version="1.0" encoding="UTF-8" ?>

<kontakt xmlns="https://www.homepage-webhilfe.de/XML/XSD/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="kontakt.xsd">
    <name>Max Mustermann</name>
    <strasse>Musterstraße</strasse>
    <hausnr>123</hausnr>
    <plz>12345</plz>
    <ort>Musterstadt</ort>
</kontakt>

XSD-Datei:

<?xml version="1.0" encoding="UTF-8" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" xmlns="https://www.homepage-webhilfe.de/XML/XSD/" targetNamespace="https://www.homepage-webhilfe.de/XML/XSD/" elementFormDefault="qualified">
    <xs:element name="kontakt">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string" />
                <xs:element name="strasse" type="xs:string" />
                <xs:element name="hausnr" type="xs:string" />
                <xs:element name="plz" type="xs:string" />
                <xs:element name="ort" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Wichtig: In dem Beispiel von oben muss jedes Element der Sequenz exakt einmal vorkommen. Möchten Sie dies ändern, so müssen Sie die Attribute minOccurs und maxOccurs der element-Elemente ändern. Die Reihenfolge muss jedoch in allen Fällen eingehalten werden.

Übrigens: Bei einer Sequenz ist es nicht erlaubt, dass vor, zwischen oder nach den Elementen ein Text notiert wird. Möchten Sie dies erlauben, so müssen Sie das Attribut mixed im complexType-Element mit dem Wert true belegen.


Mit dem Element choice können Sie in XSD eine Auswahl definieren. Eine Auswahl ist ein komplexer Typ, welcher angibt, dass eines der angegebenen Elemente notiert werden muss.

<xs:element name="datentraeger">
    <xs:complexType>
        <xs:choice>
            <xs:element name="hdd" type="xs:string" />
            <xs:element name="ssd" type="xs:string" />
            <xs:element name="usbstick" type="xs:string" />
        </xs:choice>
    </xs:complexType>
</xs:element>

Wie beim element-Element auch, gibt es beim choice-Element die Attribute minOccurs und maxOccurs, um somit die Anzahl der Vorkommnisse festzulegen. Dies hat zur Folge, dass Sie im XML-Element mehrmals zwischen einem der definierten Elemente auswählen können.

XML-Datei:

<?xml version="1.0" encoding="UTF-8" ?>

<datentraeger xmlns="https://www.homepage-webhilfe.de/XML/XSD/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="datentraeger.xsd">
    <hdd>Western Digital Blue WD10EZEX</hdd>
    <ssd>Samsung 840 EVO</ssd>
    <usbstick>SanDisk Cruzer Fit 32GB</usbstick>
    <hdd>Toshiba DT01ACA050</hdd>
</datentraeger>

XSD-Datei:

<?xml version="1.0" encoding="UTF-8" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" xmlns="https://www.homepage-webhilfe.de/XML/XSD/" targetNamespace="https://www.homepage-webhilfe.de/XML/XSD/" elementFormDefault="qualified">
    <xs:element name="datentraeger">
        <xs:complexType>
            <xs:choice maxOccurs="unbounded">
                <xs:element name="hdd" type="xs:string" />
                <xs:element name="ssd" type="xs:string" />
                <xs:element name="usbstick" type="xs:string" />
            </xs:choice>
        </xs:complexType>
    </xs:element>
</xs:schema>

Übrigens: Diese Variante kann in etwas angepasster Form auch dazu verwendet werden, die Reihenfolge von Elementen im XML-Baum dynamisch zu gestalten.


Die Definition eines Attributs erfolgt mittels des Elements attribute. Das attribute-Element wird dabei i. d. R. direkt im complexType-Element notiert und ist dem element-Element sehr ähnlich, denn auch hier gibt es die Attribute name, type, default und fixed. Auch die Referenzierung von Attributen mittels des ref-Attributs sowie die Deklaration eines anonymen Datentyps (dabei fällt das type-Attribut weg und der Datentyp wird im Elementinhalt deklariert) sind möglich.

<xs:attribute name="speicher" type="xs:integer" />

Wichtig: Denken Sie daran, dass als Datentyp für Attribute nur einfache Typen zulässig sind.

Möchten Sie festlegen, ob ein Attribut vorkommen muss, so können Sie das Attribut use verwenden. Als Wert für das use-Attribut sind required (Attribut ist erforderlich), optional (Attribut kann, muss aber nicht vorkommen - dies ist der Standardwert) und prohibited (Attribut darf nicht angegeben werden) möglich.

<xs:attribute name="speicher" type="xs:integer" use="required" />

Übrigens: Der Wert prohibited wird dazu verwendet, Attribute aus einem bestehenden Datentyp wieder zu entfernen. Mehr dazu erfahren Sie im Thema Ableitung.


Möchten Sie mit XSD ein leeres Element deklarieren, so können Sie das Element complexType einfach leer lassen. Soll das Element über Attribute verfügen, so können Sie dem complexType-Element natürlich trotzdem attribute-Elemente unterordnen.

<xs:element name="datentraeger">
    <xs:complexType>
        <xs:attribute name="speicher" type="xs:integer" use="required" />
    </xs:complexType>
</xs:element>

Im Regelfall sind komplexen Elementen weitere Elemente untergeordnet. Möchten Sie einen komplexen Datentyp definieren, dem lediglich ein direkter Inhalt (z. B. ein Text oder eine Zahl) untergeordnet werden soll (z. B. weil das Element über Attribute verfügen soll), so benötigen Sie das Element simpleContent. Diesem wird das extension-Element untergeordnet, welches eigentlich für die Ableitung genutzt wird (dazu später mehr). Mit Hilfe des Attributs base legen Sie den Basistyp (z. B. xs:string oder xs:integer) fest. Soll das Element über Attribute verfügen, so können Sie die attribute-Elemente dem extension-Element unterordnen.

<xs:element name="speicher">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="groesse" type="xs:integer" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

Ein gültiger XML-Syntax zum obigen Ausschnitt eines XML Schemas würde wie folgt aussehen:

<speicher groesse="250">Samsung 840 EVO</speicher>
Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen OK