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.
Sequenzen
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.
Auswahl
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.
Attribute
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.
Leere Elemente
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>
Text-Elemente
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>