Seit 2 Mai 2001 ist XML Schema als Standard verabschiedet. Natürlich gibt es Neuigkeiten und Unterschiede zu m bisherigen Interims Standard XDR.
Ein XML-Schema Dokument besteht aus der Kombination einzelner Schemakomponenten.
Es gibt 12 verschiedene, vordefinierte Komponenten, die grob in drei Klassen eingeteilt werden können:
1) Primäre Komponenten
Diese haben Namen und auf sie kann unabhängig zugegriffen werden
- Simple Type-Definitionen
- Complex Type-Definitionen
- Attribute-Deklarationen
- Element-Deklarationen
2) Sekundäre Komponenten
Diese können Namen haben und auf sie kann unabhängig zugegriffen werden
- Attribute Group-Definitionen
- Identity Constraint-Definitionen
- Model Group-Definitionen
- Notation-Definitionen
3) Hilfskomponenten
Kleine Teile anderer Komponenten, die nicht von ihrem Kontext unabhängig sind
und auf die auch nicht unabhängig zugegriffen werden kann
- Annotations
- Model Groups
- Particles
- Wildcards
Die Liste ist natürlich nicht komplett, aber ein gutes Nachschalgewerk finden sie unter msdn.microsoft.com/xml, sowie in der neuen MS XML 4.0 Parser SDK.
Gehen wir hier auf ein paar dieser Komponenten genauer ein:
ELEMENT
Elemente können in XSD auf unterschiedliche Arten definiert werden:beispielsweise so:
<element name="name" type="type" minOccurs="int" maxOccurs="int"/> <element name="name" minOccurs="int" maxOccurs="int"> <complexType> ? </complexType> </element> <element name="name" minOccurs="int" maxOccurs="int"> <simpleType> |
ATTRIBUTE
Für Attribute besteht auch die Möglichkeit eigene Attribute zu definieren. Dazu dient
die Attribute Komponente und geschieht beispielsweise auf folgende Arten:
<attribute name="name" type= "simple-type"use="how-its-used" value="value"/> <attribute name="name" use="how-its-used" value="value"> <simpleType> <restriction base="simple-type"> <facet value="value"/> ? </restriction> </simpleType> </attribute> |
Ein kleines Beispiel für ein Attribut:
<attribute name="Category" use="required"> <simpleType> <restriction base="string"> <enumeration value="autobiography"/> <enumeration value="non-fiction"/> <enumeration value="fiction"/> </restriction> </simpleType> </attribute> |
Was aber neu ist, ist die Möglichkeit mehrere Attribute in einer Attributliste zusammenzufassen. Dabei wird eine Reihe von Attributen in einer benannten Gruppe zusammengefasst, die dann referenziert werden kann,was den Effekt hat, als stünden alle Attribute Definitionen an Stelle der Referenz. Dies sieht dann bspw. so aus:
<xs:attributeGroup name="smallGroup"> <xs:attribute . . ./> . . . </xs:attributeGroup> . . . <xs:complexType name="NeuerTyp"> . . . <xs:attributeGroup ref="smallGroup"/> </xs:complexType> |
MODEL GROUP
Eine Model Group ist einfach eine Gruppe die durch verschiedene Kombinations-möglichkeiten entsteht. Dies entspricht in etwa den logischen und/oder Verknüpfungen. Eine Group entsteht dabei entweder, indem alle Elemente genau einmal enthalten sein müssen (all), die Elemente mindestens einmal, aber auch öfter auftreten können (sequence) oder einer Auswahl aus mehreren Möglichkeiten (choice).
Beispiel dazu:
<all> <element name="Title" type="string" minOccurs="1" maxOccurs="1"/> <element name="Author" type="string" minOccurs="1" maxOccurs="1"/> <element name="Date" type="string" minOccurs="1" maxOccurs="1"/> <element name="ISBN" type="string" minOccurs="1" maxOccurs="1"/> <element name="Publisher" type="string" minOccurs="1" maxOccurs="1"/> </all> |
WILDCARDS
Eine eigentlich, man gestatte mir die Bemerkung, eine ganz witzige Sache. Eine Wildcard hat das any Element als Komponente. Damit kann in eine XML-Schema-
Instanz an ausgewiesenen Stellen beliebiger wohlgeformter XML Code eingefügt werden.
Dabei kann festgelegt werden, wie der Schemaprozessor mit dem ?fremden? Code umgehen
soll: strict um den Code validieren zu müssen, lax um zu validieren soviel geht und
skip um die Validierung zu umgehen. Im namespace Attribute wird festgelegt, wo der
eingefügte Code herstammt, um eventuell validieren zu können. Die Syntax des any Elements sieht an hand eines Beispiels folgendermaßen aus:
<element name="Review"> <complexType> <sequence> <any namespace="##local" minOccurs="0" maxOccurs="unbounded"/> </sequence> </complexType> </element> |