5. XML Schema

5.1. Wat is het?

In een XML Schema leg je de structuur van je XML-document vast.
Hier bepaal je wat wel en wat niet toegelaten is in je XML-document.

Er zijn twee soorten schema's:

Een schema is zelf ook een XML-document, maar het wordt opgeslagen met extensie .XSD, van XML Schema Definition

In het XML document verwijs je naar het schema met een attribuut in de begintag van het document element:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="namespaceURI schemaNaam.xsd"

Of zonder expliciet gebruik van een namespace:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schemaNaam.xsd"

Bekijk bv. de broncode van deze XML zonder en met namespaces en bijhorende XSD's.

Om het XML-document en het schema samen te valideren kan je terecht op DesicionSoft – of gebruik de Visual Studio (Express).

5.2. Structuur van een XML Schema

Bekijk bv. de broncode van het voorbeeld van bestellingen zonder en met namespaces en bijhorende XSD's

5.3. Complex element

Een complex element bevat child elementen. Het document element is altijd een complex element.

Syntax: <xsd:element name="elementNaam" type="typeNaam" />

waarbij "typeNaam" een zelfverzonnen naam voor het complex type is.
Als je namespaces gebruikt, wordt dit: type="prefix:typeNaam".
Het is de gewoonte (maar niet verplicht) dat de naam van een type eindigt op Type, bv: adresType

Mogelijke attributen:

Verderop in je schema definieer je hoe dit complexe element samengesteld is:

<xsd:complexType name="typeNaam">
[inhoud]
</xsd:complexType>

De typeNaam is dezelfde als die in de declaratie, alleen zet je er nooit een prefix bij.

De inhoud van een complex type bestaat uit child elementen en die staan in een bepaalde relatie tot elkaar:

Als je weet dat er nog extra elementen bij kunnen komen, kan je dit voorzien met xsd:any, bv:
<xsd:any minOccurs="0" maxOccurs="3" /> betekent: hier kunnen max. 3 elementen extra toegevoegd worden

Bekijk opnieuw de broncode van het voorbeeld van bestellingen zonder en met namespaces en bijhorende XSD's.

5.4. Simple element

Een simple element bevat enkel karakterdata, gegevens dus, geen andere elementen

Syntax: <xsd:element name="elementNaam" type="xsd:type" />

Met als mogelijkheden voor "xsd:type" o.a.:

typetoegelaten waarden in element
xsd:stringalle mogelijke karakters
xsd:decimaldecimale getallen (pas op: de komma is een punt!)
xsd:floatfloating point getallen, 4 bytes
xsd:doublefloating point getallen, 8 bytes
xsd:integergehele getallen
xsd:bytegeheel getal tussen -128 en 127 (1 byte)
xsd:shortgeheel getal tussen -32.768 en 32.767 (2 bytes)
xsd:intgeheel getal tussen -2.147.483.648 en 2.147.483.647 (4 bytes)
xsd:longheel grote gehele getallen (8 bytes)
xsd:booleantrue of false
xsd:datedatum in formaat yyyy-MM-dd
xsd:timetijd in formaat hh:mm:ss

Mogelijke attributen:

Een attribuut is een simple element. Het element waar het bij staat is altijd een complex element.
Syntax: <xsd:attribute name="attribuutNaam" type="xsd:type" />

Standaard is een attribuut optioneel; als je het verplicht wil maken, voeg je als optie toe: use="required"

Bekijk opnieuw de broncode van het voorbeeld van bestellingen zonder en met namespaces en bijhorende XSD's.

5.5. Elementen met gemengde inhoud

Een element met zowel tekst als een attribuut of ander element als inhoud is een complexType met mixed content.

Een element dat naast tekst (beter: karakterdata) nog één of meer elementen bevat beschrijven we als volgt:
<xsd:complexType name="typeNaam" mixed="true">
  <xsd:sequence>
    <xsd:element name="elementNaam" type="typeNaam" /> (kan meermalen)
  </xsd:sequence>
</xsd:complexType>

Bekijk bv. de straat in klanten2.xsd in de XSD's.

Bevat een element enkel attributen en eventueel daarbij karakterdata (mixed="true"), geen andere elementen, dan kunnen we met simpleContent aangeven hoe de inhoud er precies uitziet:
<xsd:complexType name="typeNaam" mixed="true">
  <xsd:simpleContent>
    <xsd:extension base="simpleTypeVanData">
      <xsd:attribute name="attribuutNaam" type="..." />
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>

5.6. Restricties op simple types

Met restricties kan je heel precies bepalen welke waarden geldig zijn voor een element.
Werkwijze:

Restricties voor getallen:

BeperkingOmschrijving
xsd:minExclusive value="getal"de waarde moet groter zijn dan het opgegeven getal
xsd:minInclusive value="getal"de waarde moet groter zijn dan of gelijk aan het opgegeven getal
xsd:maxExclusive value="getal"de waarde moet kleiner zijn dan het opgegeven getal
xsd:maxInclusive value="getal"de waarde moet kleiner zijn dan of gelijk aan het opgegeven getal
xsd:totalDigits value="aantal"maximum aantal cijfers waaruit het getal mag bestaan
xsd:fractionDigits value="aantal"maximum aantal cijfers na de komma

Restricties voor tekst:

BeperkingOmschrijving
xsd:length value="aantal"aantal karakters waaruit de tekst moet bestaan
xsd:minLength value="aantal"minimum aantal karakters waaruit de tekst moet bestaan
xsd:maxLength value="aantal"maximum aantal karakters waaruit de tekst mag bestaan
xsd:enumeration value="waarde"som één voor één de mogelijke keuzes op
xsd:pattern value="reguliere expressie"patroon waaraan de tekst moet voldoen

Klik hier voor meer info over reguliere expressies.

Een voorbeeldje vind je hier met bijhorende XSD.

5.7. Sleutels en referenties

Opm: bestudeer eerst XPath.

Opm 2: meer info vind je op Zvon

Bij de beschrijving van je XML-documentElement in het XML-schema kan je opnemen welke tags een sleutel of een referentie naar een sleutel zijn.

Mogelijkheden

eigenschapOmschrijving
xsd:uniquede elementwaarden zijn uniek, geen dubbels toegelaten.
Bij het element zelf kan je eventueel aangeven dat het niet noodzakelijk moet bestaan: nillable="true"
xsd:keyde elementwaarde is uniek en moet bestaan
xsd:keyrefhet element verwijst naar een 'key' of een 'unique' element

Bij alle drie voorzie je dezelfde basisstructuur:

<xsd:eigenschap name="beschrijvendeNaam">
  <xsd:selector xpath="XPathNaarParentNode" />
  <field xpath="nodeNaam" />
</xsd:eigenschap>

De XPath-referentie die je hier opgeeft is altijd relatief t.o.v. het element waarin de key(ref) gedeclareerd wordt, meestal dus het documentElement, en begint met: ./
De "nodeNaam" is ofwel een elementnaam ofwel een attribuutnaam met '@' ervoor.

Zo wordt bv. het documentElement in de XSD voor bestel.xml uitgebreid tot dit voorbeeld.