Datentypen-Definitionen eines XML-Schema zur Validierung nutzen

https://bildung.social/@oerinformatik/111970765687640258

https://oer-informatik.de/xml-schema-datentypen

XML Schema, XSD, Datentypen, simpleType, Restriction, Facetten, pattern, enumeration, Werteraum, lexikalischer Raum, kanonische Repräsentation

tl/dr; (ca. 13 min Lesezeit): XML Schema (XSD) stellt einen gewaltigen Sprachumfang zur Deklaration und Spezifizierung von Datentypen bereit. Neben vielen bereits vorhandenen Datentypen und den komplexen eigenen Datentypen bietet sich die Möglichkeit, über zahlreiche Restrictions die Werte individuell einzugrenzen und somit die Validität über die reine Struktur auf den Inhalt der Daten auszuweiten [AI-Assisted]. (Zuletzt geändert am 27.10.2026)

Dieser Artikel ist Bestandteil einer Serie zu den XML-Grundlagen:

Schon fit in diesem Thema? Nutze die Kann-Liste und die Leitfragen unter dem Artikel als Checkliste, ob Du die relevanten Kompetenzen bereits hast.

Dieser Artikel baut auf der Kann-Liste des Artikels Die Struktur von XML-Dokumenten gegen ein Schema validieren auf.

Nach Durchlesen des Artikels kann ich…

  • … passende einfache Datentypen aus den Built-in-Datatypes auswählen,

  • … Werteraum, lexikalischen Raum und kanonische Repräsentation eines Datentyps unterscheiden,

  • … für die Datentypen (unterschiedliche) Literale nennen, die gültige Werte beschreiben,

  • … xs:string, xs:normalizedString und xs:token unterscheiden,

  • … eigene Datentypen über Restrictions erstellen,

  • … Facetten (pattern, enumeration, minInclusive/maxInclusive, totalDigits/fractionDigits) anwenden, um die Werte eines Datentyps einzugrenzen.

Datentypen

Im Gegensatz zur DTD können in XML Schema Datentypen genauer spezifiziert und sogar im Inhalt deutlicher eingegrenzt werden. Hierbei bietet XML Schema derart viele Möglichkeiten, dass die Datentypen eine eigene Spezifikation (Part 2: Datatypes) mit vielen mehrseitigen Kapiteln bekommen haben.

Verlinkt ist hier die aktuelle Fassung XSD 1.1. Sie ergänzt gegenüber XSD 1.0 u. a. die Datentypen xs:dateTimeStamp (ein xs:dateTime mit verpflichtender Zeitzone), xs:dayTimeDuration und xs:yearMonthDuration (Zeitdauern nur aus Tagen/Stunden/Minuten/Sekunden bzw. nur aus Jahren/Monaten), die Facette explicitTimezone (Zeitzone vorgeschrieben, verboten oder optional) sowie mit <xs:assertion> Bedingungen in Form von XPath-Ausdrücken. Viele Werkzeuge – z. B. die Bibliothek libxml2 und damit xmllint – unterstützen allerdings nur XSD 1.0; alle übrigen Beispiele in diesem Artikel kommen daher mit XSD 1.0 aus.

Wir haben bislang nur einfache Zeichenketten genutzt (type="xs:string"), die komplexen Elemente (mit Unterelementen und/oder Attributen) oder den Irgendwas-„Joker“ (type="xs:anyType"). Der Sprachumfang differenziert jedoch sehr umfangreich weiter aus, wie die folgende Übersicht der Built-in-Datentypen zeigt (die man ähnlich in der Spezifikation findet):

Eine Liste der XML-Datentypen als Pseudo-UML-Vererbungsstruktur

Bei der Definition von Datentypen werden unterschiedliche Eigenschaften gegeneinander abgegrenzt. Beiß die Zähne zusammen, durch diese Theorie müssen wir kurz durch:

  • Der Werteraum (value space) beschreibt die Menge (set) der Werte eines Datentyps. Bei xs:byte sind das z. B. alle Ganzzahlen zwischen -128 und 127.

  • Der lexikalische Raum (lexical space) beschreibt die Menge derjenigen Zeichenketten, die auf Werte des Werteraums gemappt werden können (lexical mapping). Bei xs:byte wären das alle reinen Ziffernfolgen von -128 bis 127, aber eben auch +17, 00124, -010 - also andere Zeichenketten, die eindeutig als xs:byte ausgewertet werden können. Welche das jeweils sind, definiert der Datentyp.

  • Literale sind Zeichenketten aus (keinem oder mehr) Zeichen des Universal Character Set (UCS - der Zeichensatz, der die Basis für UTF ist). Literale können gültige Repräsentationen eines spezifischen Datentyp-Werts sein (dann wären sie im lexikalischen Raum). Sie können aber auch ungültige Zeichenketten sein, für die es kein lexikalisches Mapping gibt.

Wem das zu abstrakt klingt: Der Wert 1, der sich im Werteraum einer Ganzzahl (z.B. xs:int) befindet, kann durch verschiedene lexikalische Repräsentationen (lexical representations) ausgedrückt werden: +1, 01, 0001 usw. Sie alle stellen Literale dar, die auf den Wert 1 gemappt werden. Es gibt aber auch Literale, die auf keinen Wert im Datentyp xs:int gemappt werden: 1.0 beispielsweise oder eins.

Bei einer Ganzzahl vom Typ xs:int stellen beispielsweise die Literale 42, 042, +42 und +0042 lexikalische Repräsentationen desselben Werts dar.

Ein besonderes Literal für jeden Wert stellt hierbei die kanonische Repräsentation (canonical representation) dar. Diese Repräsentation wird so definiert, dass es für jeden möglichen Wert des Werteraums ein einzigartiges kanonisches Literal gibt. Es ist also eine Teilmenge des lexikalischen Raums, die eine Eins-zu-eins-Beziehung zum Werteraum aufspannt (canonical mapping). Für xs:int ist festgelegt, dass die kanonische Repräsentation keine führenden Nullen und bei positiven Zahlen kein Vorzeichen enthält: +0042, 042 und 42 werden alle auf denselben Wert gemappt, kanonisch ist aber nur 42.

Der Werteraum ist zunächst für alle vorgegebenen Typen definiert, kann aber über Facetten für eigene Typen weiter eingegrenzt werden.

Die wesentlichen Datentypen in der Kurzübersicht:

Datentyp Beispiel Eigenschaften
xs:string Hallo Welt! Jeder beliebige Text
xs:dateTime 1999-05-31T13:20:00.000-05:00 Für die einzelnen Teilbereiche gibt es eigene Datentypen (xs:date, xs:time, xs:gMonth…)
xs:long von -9223372036854775808,
über … -1, 0, 1, …
bis 9223372036854775807
64 Bit, vorzeichenbehaftet, basiert auf xs:integer
xs:int von -2147483648,
über … -1, 0, 1,
bis … 2147483647
32 Bit, vorzeichenbehaftet, basiert auf xs:long
xs:float -INF, INF, NaN
-1E4, -0, 0, 12.78E-2, 12
32-bit Gleitkommazahl: geringere Präzision, geringere Bereichsgrenze als xs:double
xs:double -INF, INF, NaN
-1E304, -0, 0, 12.78E-2, 12
64-bit Gleitkommazahl: größere Präzision, größerer Definitionsbereich als xs:float
xs:boolean true
false
0, 1
Wahrheitswert; 1 steht für true, 0 für false
xs:base64Binary Zh8+H6zd Gültige Zeichen sind [A-Za-z0-9+/], am Ende ggf. = als Füllzeichen

Ableitung eigener Datentypen durch Einschränkung (Restriction)

Über Restrictions können auf Basis der simpleTypes eigene Datentypen erstellt werden. Jeder Datentyp bringt dafür einen eigenen Kanon an möglichen Constraining facets mit. Neue Typen werden über ein <xs:simpleType />-Element deklariert. Die Constraining facets werden als Restrictions bezogen auf einen Basis-Typen (base) angegeben (<xs:restriction base="xs:string">). Insgesamt sieht das beispielsweise so aus:

  <xs:simpleType name="e-mail">
    <xs:restriction base="xs:string">
      <xs:pattern value="[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+" />
    </xs:restriction>
  </xs:simpleType>

Alle Code-Beispiele sind Ausschnitte eines Schemas, dessen Wurzelelement den Namensraum deklariert: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">. Im vorigen Teil stand dafür das Präfix xsd: – das Präfix ist frei wählbar, entscheidend ist die Bindung an den Namensraum. In diesem Artikel nutzen wir durchgängig xs:, auch bei den Namen der eingebauten Datentypen (xs:string, xs:int), denn genau so werden sie im Schema referenziert. Facetten nennen wir im Text ohne Präfix (pattern), im Schema stehen sie als Elemente mit Präfix (<xs:pattern />).

Der volle Umfang der Constraining facets lässt sich in der Spezifikation nachlesen, die wesentlichen sind etwa folgende:

Constraining facets Beschreibung
Constraint gibt es bei…
Beispiel
pattern Value muss RegEx erfüllen
möglich an allen einfachen Datentypen (auch xs:boolean)
<xs:restriction base="xs:string">
    <xs:pattern value="[0-9A-F]+" />
</xs:restriction>
enumeration Wert muss einem der gelisteten Werte entsprechen
möglich an allen Datentypen bis auf xs:boolean
<xs:restriction base="xs:string">
    <xs:enumeration value="ja"/>
    <xs:enumeration value="nein"/>
</xs:restriction>
whiteSpace Wie wird mit Whitespaces umgegangen (Carriage Return, Line Feed, Tabs, Spaces)?
preserve = keine Normalisierung,
replace= alle werden zu Spaces,
collapse= wie replace, dazu werden aufeinanderfolgende Spaces zu einem zusammengefasst und Spaces an Beginn/Ende entfernt
änderbar nur an xs:string und davon abgeleiteten Typen (z. B. xs:normalizedString, xs:token); alle anderen atomaren Typen nutzen fest collapse
<xs:restriction base='xs:normalizedString'>
    <xs:whiteSpace value='collapse'/>
</xs:restriction>
length
minLength
maxLength
Legt die (Mindest-/Maximal-)Anzahl der Zeichen fest, die der Wert enthalten darf.
möglich an xs:string und davon abgeleiteten Typen sowie an xs:anyURI, xs:hexBinary und xs:base64Binary (dort Anzahl der Bytes)
<xs:restriction base='xs:string'>
    <xs:minLength value='1'/>
</xs:restriction>
minExclusive
minInclusive
maxExclusive
maxInclusive
Legt die untere/obere Grenze des Zahlenbereichs fest (inkl. bzw. exkl. dieser Grenze)
möglich an allen Zahlentypen sowie an Datums- und Zeittypen
<xs:restriction base='xs:integer'>
    <xs:maxInclusive value='100'/>
</xs:restriction>
fractionDigits
totalDigits
Legt die Anzahl der Nachkomma-Stellen bzw. der Stellen insgesamt fest (also inkl. Nachkommastellen)
möglich an xs:decimal und davon abgeleiteten Typen (z. B. xs:integer)
<xs:restriction base='xs:decimal'>
    <xs:fractionDigits value='1'/>
    <xs:totalDigits value='4'/>
</xs:restriction>

Zeichenketten-Datentypen

Datentyp Beispiel Eigenschaften
xs:string Hallo Welt! Jeder beliebige Text
xs:normalizedString Max Mustermann Basiert auf xs:string, enthält aber keine Carriage Returns, Line Feeds und Tabs (sie werden beim Einlesen durch Spaces ersetzt)
xs:token ab in den Urlaub Basiert auf xs:normalizedString, enthält zusätzlich keine Spaces am Anfang und Ende und keine doppelten Spaces hintereinander
xs:anyURI http://www.oer-informatik.de/xml-schema Absoluter oder relativer URI (z. B. URL)

Datums / Zeittypen

Datentyp Beispiel Eigenschaften
xs:duration P1Y2M3DT10H30M12.3S Zeitdauer, beginnt mit P, T trennt Datums- und Zeitanteil
xs:dateTime 1999-05-31T13:20:00.000-05:00 Zeitpunkt, Zeitzone optional
xs:time 13:20:00.000 Uhrzeit
xs:date 1999-05-31 Datum
xs:gYearMonth 1999-02 Monat eines Jahres
xs:gMonthDay –05-31 Wiederkehrender Tag im Jahr
xs:gYear 1999 Jahr
xs:gMonth –05 Monat
xs:gDay —31 Wiederkehrender Tag im Monat

Ganzzahlen- und Festkommazahltypen

Datentyp zulässige Literale Eigenschaften
xs:decimal -1.23
0
123
+001000.00
Festkommazahl; führendes Plus und führende/endende Nullen sind erlaubt
xs:integer -1, 0, 1 Basiert auf xs:decimal
xs:nonNegativeInteger 0, 1, 2 Basiert auf xs:integer
xs:positiveInteger 1, 2, … Basiert auf xs:nonNegativeInteger
xs:nonPositiveInteger -2, -1, 0 Basiert auf xs:integer
xs:negativeInteger -2, -1 Basiert auf xs:nonPositiveInteger
xs:long -9223372036854775808, … -1, 0, 1, … 9223372036854775807 64 Bit, vorzeichenbehaftet, basiert auf xs:integer
xs:unsignedLong 0, 1, … 18446744073709551615 64 Bit, vorzeichenlos, basiert auf xs:nonNegativeInteger
xs:int -2147483648, … -1, 0, 1, … 2147483647 32 Bit, vorzeichenbehaftet, basiert auf xs:long
xs:unsignedInt 0, 1, …4294967295 32 Bit vorzeichenlos, basiert auf xs:unsignedLong
xs:short -32768, … -1, 0, 1, … 32767 16 Bit, vorzeichenbehaftet, basiert auf xs:int
xs:unsignedShort 0, 1, … 65535 16 Bit vorzeichenlos, basiert auf xs:unsignedInt
xs:byte -128, …-1, 0, 1, … 127 8 Bit, vorzeichenbehaftet, basiert auf xs:short
xs:unsignedByte 0, 1, … 255 8 Bit vorzeichenlos, basiert auf xs:unsignedShort

Gleitkommatypen

Datentyp Beispiel Eigenschaften
xs:float -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN 32-bit
xs:double -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN 64-bit

Weitere Datentypen

Datentyp Beispiel Eigenschaften
xs:boolean true
false
0, 1
Wahrheitswert
xs:base64Binary GpM7 Base64-kodierte Binärdaten
xs:hexBinary 0FB7 Hexadezimal kodierte Binärdaten (zwei Ziffern je Byte)

XML-spezifische Datentypen

Datentyp Beispiel Eigenschaften
xs:Name adresse Basiert auf xs:token. Für XML-Elemente zulässiger String (z. B. keine Zahlen am Anfang).
xs:QName kunde:adresse Voller Name eines Elements/Attributs (Bsp.: namespaceprefix:localpart)
xs:NCName adresse Basiert auf xs:Name. Local Part eines Element-/Attributnamens (“non-colonized”).
xs:language de-DE
en-US
Basiert auf xs:token. Zeichenketten, die gemäß XML 1.0 Standard eine Sprache repräsentieren
xs:ID k4711 Ein einzigartiger xs:Name, der ein Element identifiziert
xs:IDREF k4711 Muss dem Wert einer xs:ID entsprechen, da auf diese referenziert wird.
xs:IDREFS k4711 k4712 Space-getrennte Liste von xs:IDREF
xs:ENTITY logo Name einer in der DTD deklarierten ungeparsten Entity (Attributtyp ENTITY aus XML 1.0)
xs:ENTITIES logo banner Space-getrennte Liste von xs:ENTITY
xs:NOTATION png xs:QName einer im Schema deklarierten Notation (xs:notation); nur über eine Aufzählung (enumeration) nutzbar
xs:NMTOKEN US, Brésil Basiert auf xs:token. NMToken nutzen die gleichen Zeichen wie xs:Name, haben aber nicht die Einschränkung mit bestimmten Zeichen nicht beginnen zu dürfen.
xs:NMTOKENS US UK, Brésil Canada Mexique Space-getrennte Liste von xs:NMTOKEN

Leitfragen

  1. Was unterscheidet Werteraum, lexikalischen Raum und kanonische Repräsentation eines Datentyps?

Der Werteraum ist die Menge der Werte eines Datentyps, der lexikalische Raum die Menge der Zeichenketten (Literale), die auf diese Werte abgebildet werden – z. B. stehen 1, +1 und 0001 für denselben xs:int-Wert. Die kanonische Repräsentation ist genau ein festgelegtes Literal je Wert. Siehe Abschnitt „Datentypen“.

  1. Wie leitest Du einen eigenen Datentyp durch Einschränkung ab?

Du deklarierst ein xs:simpleType-Element und darin eine xs:restriction mit einem Basistyp (base="xs:string"); innerhalb der Restriction grenzt Du die Werte mit Facetten wie xs:pattern ein. Siehe Abschnitt „Ableitung eigener Datentypen durch Einschränkung (Restriction)“.

  1. Mit welchen Facetten grenzt Du Zeichenketten und Zahlen ein?

Zeichenketten schränkst Du mit pattern (regulärer Ausdruck), enumeration (Liste erlaubter Werte), length, minLength und maxLength ein; Zahlen mit minInclusive/maxInclusive bzw. minExclusive/maxExclusive sowie bei Dezimalzahlen mit totalDigits und fractionDigits. Siehe Abschnitt „Ableitung eigener Datentypen durch Einschränkung (Restriction)“.

  1. Worin unterscheiden sich xs:string, xs:normalizedString und xs:token?

xs:string erlaubt beliebigen Text, xs:normalizedString enthält keine Zeilenumbrüche und Tabs, und xs:token hat zusätzlich keine Spaces am Anfang und Ende und keine mehrfachen Spaces hintereinander. Siehe Abschnitt „Zeichenketten-Datentypen“.

  1. Welche Ganzzahltypen gibt es, und wie hängen sie zusammen?

Alle basieren auf xs:decimal über xs:integer; davon abgeleitet sind die vorzeichenbehafteten Typen xs:long (64 Bit), xs:int (32 Bit), xs:short (16 Bit) und xs:byte (8 Bit) sowie über xs:nonNegativeInteger die vorzeichenlosen xs:unsignedLong bis xs:unsignedByte. Siehe Abschnitt „Ganzzahlen- und Festkommazahltypen“.

  1. Wie notierst Du Datum, Uhrzeit und Zeitdauer in XML Schema?

Ein Datum (xs:date) schreibst Du als JJJJ-MM-TT, eine Uhrzeit (xs:time) als hh:mm:ss, einen Zeitpunkt (xs:dateTime) als Kombination mit T dazwischen und optionaler Zeitzone wie -05:00; eine Zeitdauer (xs:duration) beginnt mit P, z. B. P1Y2M3DT10H30M12.3S. Siehe Abschnitt „Datums / Zeittypen“.


Hinweis zur Nachnutzung als Open Educational Resource (OER)

Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Datentypen-Definitionen eines XML-Schema zur Validierung nutzen” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/xml-schema-datentypen veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/datenformate/xml. Erstellt mit KI-Assistenz; von mir umfassend redaktionell überarbeitet, geprüft und freigegeben. Stand: 27.10.2026.

[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: