Einführung
Der Zweck von XML-Schemata ist, XML-Schnittstellen so genau wie möglich zu beschreiben. XML-Schnittstellen können zum Beispiel Datenschnittstellen zwischen Computersystemen sein. Die Beschreibung der im XML zulässigen Datenstrukturen und Dateninhalten erfolgt über ein oder mehrere XML-Schemata. Ein XML-Schema wird auch als XSD (XML-Schema-Definition) bezeichnet und mit der Endung ".xsd" gespeichert.
Konkret wird per XML-Schema beschrieben:
- welche Elemente und Attribute vorkommen,
- in welcher Reihenfolge / Schachtelung Elemente und Attribute vorkommen,
- welche Inhalte in den Elementen und Attributen erlaubt sind.
Mit Hilfe eines Parsers oder eines anderen XML-Tools kann ein XML-Dokument gegen ein XMNL-Schema geprüft werden. Es wird geprüft, ob der XML-Datenstrom den Regeln des XML-Schemas entspricht.
- Ein korrektes XML-Dokument nennt man wohlgeformt, wenn es den allgemeinen XML-Regeln entspricht.
- Ein korrektes XML-Dokument nennt man gültig (valide), wenn es die Regeln eines XML-Schemas einhält.
Ein XML-Schema ist genau wie eine XML-Datei aufgebaut, also mit öffnenden und schließenen Elementtags.
<?xml version="1.0" encoding="UTF-8"?> <Fahrzeug> <Farbe>Rot</Farbe> <Kw>111</Kw> <Verbrauch>9.5</Verbrauch> </Fahrzeug>
Es folgt das Wurzelelement "Fahrzeug" und darunter drei Unterelemente "Farbe", "Kw" und "Verbrauch".
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Fahrzeug"> <xs:complexType> <xs:sequence> <xs:element name="Farbe" type="xs:string"/> <xs:element name="Kw" type="xs:integer"/> <xs:element name="Verbrauch" type="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Dann wird ein Namespace definiert und durch das Kürzel "xs" (könnte auch "xsd" oder "abc" sein) ein Bezug zum verwendeten W3C-Namespace hergestellt.
(Durch Namespaces können z.B. mehrere Elemente mit gleichem Namen aus unterschiedlichen Namespaces konfliktfrei in einem XML-Dokument genutzt werden.
Das Element "Fahrzeug" beinhaltet keine eigentlichen Daten, sondern weitere Elemente, deshalb wird es als komplexer Typ einer Sequenz definiert.
Dieser komplexe Typ beinhaltet drei Unterlemente und deren Typdefinitionen (also was im jeweiligen Element als Inhalt erlaubt ist).
Jedes Element und jeder Typ hat das Präfix "xs" und wird dadurch dem W3C-Schema-Vokabular zugeordnet.
Validieren/Testen einer XML-Datei gegen ein XML-Schema:
Bei validome.org können XML und XSD online getestet werden.
Alternativ bei tools.decisionsoft.com/schemaValidate.
Oder man nimmt ein kostenloses XML-Freeware- oder Sharewaretool ("XMLSPEAR"), Profis nutzen Sax-/Xerces-Parser oder XML-Spy...
Datentypen (Basistypen und Ableitungen)
XML-Dokumente transportieren Daten innerhalb von Elementen und Attributen. Per XML-Schema legt man fest, welche Inhalte in Elementen und Attributen erlaubt sind. Dies geschieht konkret mit Hilfe sogenannter Schema-Datentypen. Basis aller Schema-Datentypen sind ca. 50 vordefinierten Datentypen des W3C. Man spricht auch von Basis- oder Standardtypen. Hier eine Auswahl von wichtigen Typen:
Typ | Beschreibung | Beispiel(e) |
string | Zeichenkette | Hello World |
decimal | Dezimalzahl mit "." als Trennzeichen | 1.23, +1,23, -1.23, -.12 |
integer | Zahl ohne Nachkommastellen | 1, +22, -33 |
positiveInteger | positive Ganzzahl | 1, 2, 3 |
nonNegativeInteger | positive Ganzzahl oder 0 | 0, 1, 2, 3 |
date | Datum | 2000-12-31 |
time | Zeitpunkt | 23:59:00 |
dateTime | Zeitpunkt nach ISO 8601 | 2000-12-31T23:59:00 |
boolean | logischer Wert | true, false, 0, 1 |
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Fahrzeug"> <xs:complexType> <xs:sequence> <xs:element name="Bezeichnung" type="xs:string"/> <xs:element name="Kw" type="xs:integer"/> <xs:element name="Verbrauch" type="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Die Basistypen reichen nicht immer, um Datenelemente genau genug zu beschreiben.
Dann legt man eigene Datentypen an, die von bestehenden Basistypen abgeleitet/eingeschränkt werden (Facetten).
Folgende Ableitungen/Einschränkungen sind u.a. möglich:
- Länge (length, minLength, maxLength,...)
- Grenzwerte (minInclusive, minExclusive, maxInclusive,...)
- Aufzählung (enumeration)
- Reguläre Ausdrücke (pattern)
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Fahrzeug"> <xs:complexType> <xs:sequence> <xs:element name="Bezeichnung"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="1"/> <xs:maxLength value="20"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Kw" type="xs:integer"/> <xs:element name="Verbrauch" type="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Zur Einschränkung wird eine Typdefinition geöffnet (xs:simpleType) und darin als Basistyp "xs:string" definiert.
Dieser wird dann weiter eingeschränkt, hier die Länge des Strings auf "1" bis "20" Zeichen.
... <xs:element name="Kw"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="1"/> <xs:maxInclusive value="999"/> </xs:restriction> </xs:simpleType> </xs:element> ...
Somit ist "0" ungültig, "1" ok, 01 als Wert auch ok, "999" ok, 1000 aber nicht mehr.
... <xs:element name="Geschlecht"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="m"/> <xs:enumeration value="w"/> </xs:restriction> </xs:simpleType> </xs:element> ...
... <xs:element name="PLZ"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/> </xs:restriction> </xs:simpleType> </xs:element> ...
Somit ist laut Definition in einem PLZ-Element genau 5 mal eine Ziffer von 0 bis 9 gefordert.