xsd - telescript.denayer.wenk.betelescript.denayer.wenk.be/~jve/xsd.pdf · geldige xml •...
TRANSCRIPT
http://telescript.denayer.wenk.be/~jve
Geldige XML
• Algemeen:
• Welgevormd
• Specifiek:
• Geldig
<instrument><naam> hobo</naam><soort> blaas</soort><materiaal> hout </materiaal>
</instument>
• Hangen af van het soort van gegevens
• En hoe je die gegevens wilt voorstellen
<instrument><naam> hobo</naam><soort> blaas</soort><materiaal> hout </materiaal>
</instument>
<houtblazer naam=“hobo” />
<voorwerp><naam> hobo </naam><functie>
<muziek type=“blazer” /></functie><materiaal> hout </materiaal>
</voorwerp>
...
...
Bijvoorbeeld<instrument>
<naam> hobo</naam><soort> blaas</soort><materiaal> hout </materiaal>
</instument>
• Elk instrument moet een naam hebben
• Een instrument mag een materiaal hebben, maar dat moet niet
• De naam moet voor de soort komen
XML beschrijver
• Geeft de specifieke vereisten
• Definiëert hoe je gekozen hebt de gegevens voor te stellen
~ Databank schema
Twee opties
• DTD: Document Type Definition
• Speciale syntax:
<!ELEMENT liedje (titel, artiest)>
• Eerder beperkt
• XSD: XML Schema Definition
Twee opties
• DTD: Document Type Definition
• XSD: XML Schema Definition
• Informatie over data voorstelling is ook gewoon data
• Ook gewoon in XML ipv. nieuwe syntax!
• Uitgebreider dan DTD
Terminology
<instrument soort = “blaas”> <naam> hobo </naam>
</instrument>
•Element•Inhoud•Attribuut•Waarde•Tekst
• In mijn xml-bestand laat ik een element toe met als naam “instrument”
• Dit element kan een attribuut “soort” hebben
XML
<element name = “instrument” /><attribute name = “soort” />
Nood aan metatags & regels daarvoor
• http://www.w3.org/2001/XMLSchema
• Naamruimte waarbinnen metatags gedefiniëerd worden
• Specifiëert voorwaarden waaraan een XSD bestand moet voldoen
• En is zelf ook een XSD bestand
Meta-informatie
Herinnering: Naamruimtes
• Vermijden dat dezelfde naam in verschillende contexten gebruikt wordt
• Naamruimte wordt geïdentificeerd door URI en krijgt prefix
<BVLandschap xmlns:kh= “http://denayer.be/koningshuis”xmlns:schl= “http://denayer.be/schlagers”>
<kh:koningin> Paola </kh:koningin><schl:koningin> Laura Lynn </schl:koningin>
</BVLandschap>
Herinnering: Naamruimtes
• Vermijden dat dezelfde naam in verschillende contexten gebruikt wordt
• Naamruimte wordt geïdentificeerd door URI en krijgt prefix
<BVLandschap xmlns= “http://denayer.be/koningshuis”xmlns:schl= “http://denayer.be/schlagers”>
<koningin> Paola </koningin><schl:koningin> Laura Lynn </schl:koningin>
</BVLandschap>
XSD heeft <schema> als wortel
<xs:schema
xmlns:xs= “http://www.w3.org/2001/XMLSchema”>
targetNamespace = “http://naamruimte.be”
xmlns = “http://naamruimte.be”
elementFormDefault="qualified"/>
<element> <attribute> ...
<instrument> <materiaal> ...
XSD heeft <schema> als wortel
<schema
xmlns = “http://www.w3.org/2001/XMLSchema”>
targetNamespace = “http://naamruimte.be”
xmlns:tg = “http://naamruimte.be”
elementFormDefault="qualified"/>
<element> <attribute> ...
<instrument> <materiaal> ...
Of
In XML:
<instrument xmlns = “http://naamruimte.be”xs:schemaLocation = “http://...”
xmlns:xs = “http://www.w3.org/2001/XMLSchema”>
verwijzen naar targetNamespace
te vinden op ...hier zit het attribuut
schemaLocation
Cruciaal: Datatypes• In XSD heeft elk element een datatype
• In XSD heeft elk attribuut een datatype
Datatype
Enkelvoudig Samengesteld
Ingebouwd Gebruiker
Ingebouwde DTs
• xsd:string
• xsd:decimal
• xsd:integer
• xsd:boolean
• xsd:date
• xsd:time
• ...
<xsd:element name = “naam” type = “xsd:string” />
<naam> Joost </naam>
Afgeleide enkelvoudige types
Datatype
Enkelvoudig Samengesteld
Ingebouwd Gebruiker
• Opleggen van extra beperkingen aan ingebouwde types
Afgeleide enkelvoudige types
<xsd:simpleType name="kortWoord"> <xsd:restriction base="xsd:string"> <xsd:maxLength value="5" /> </xsd:restriction></xsd:simpleType>
<xsd:element name="afkorting" type="kortWoord" />
Alternatief
<xsd:element name="afkorting"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:maxLength value="5" /> </xsd:restriction> </xsd:simpleType></xsd:element>
Naamloos type
Soorten beperkingen
• Strings
• length
• minLength
• maxLength
• pattern
Soorten beperkingen
• Getallen
• minInclusive, minExclusive
• maxInclusive, maxExclusive
• totalDigits
• fractionDigits
Soorten beperkingen
• Opsomming:
<xs:simpleType name="haarkleur"> <xs:restriction base="xs:string"> <xs:enumeration value="blond"/> <xs:enumeration value="bruin"/> <xs:enumeration value="zwart"/> <xs:enumeration value="rood"/> </xs:restriction> </xs:simpleType>
Enkelvoudige types
Datatype
Enkelvoudig Samengesteld
Ingebouwd Gebruiker
Hebben aantal extra mogelijkheden
• Element met enkelvoudig type
<xsd:element name="haarkleur" type="xsd:string"/>
• Kan default waarde hebben
<xsd:element name="haarkleur" type="xsd:string" default="blond" />
<haarkleur /> <haarkleur>blond</haarkleur>=
• Element met enkelvoudig type
<xsd:element name="status" type="xsd:string"/>
• Kan vaste waarde hebben
<xsd:element name="status" type="xsd:string" fixed="aanwezig" />
<status> aanwezig </status>
Samengesteld typesDatatype
Enkelvoudig Samengesteld
Element bevat:• Attribuut• Ander element
Samengesteld typesDatatype
Enkelvoudig Samengesteld
GemengdSamengesteldEnkelvoudigLeegInhoud:
Met lege inhoud<xs:element name="schoen"> <xs:complexType> <xs:attribute name="maat" type="integer"> </xs:complexType></xs:element>
<xs:element name="schoen" type = "schoenType" /><xs:complexType name = "schoenType"> <xs:attribute name="maat" type="integer"></xs:complexType>
Met lege inhoud<xs:element name="schoen"> <xs:complexType> <xs:attribute name="maat" type="xs:integer"> </xs:complexType></xs:element>
<schoen maat = "42" />
Met enkelvoudige inhoud
<xsd:element name="lengte"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:decimal"> <xsd:attribute name="eenheid" type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType></xsd:element>
<lengte eenheid = "cm"> 20.4 </lengte>
Vgl. enkelvoudig type
<xsd:element name="lengte" type="xsd:decimal" />
Element met enkelvoudig type:
Element met samengesteld type met enkelvoudige inhoud:
<xsd:element name="lengte"> <xsd:complexType> <xsd:simpleContent>
... </xsd:simpleContent> </xsd:complexType></xsd:element>
attributen
Samengesteld typesDatatype
Enkelvoudig Samengesteld
GemengdSamengesteldEnkelvoudigLeegInhoud:
Element dat andere elementen bevat
Met samengestelde inhoud
<xsd:complexType name="slagwerkType"> <xsd:all> <xsd:element name="naam" type="string" /> <xsd:element name="materiaal" type="string" /></xsd:all> </xsd:complexType><xsd:element name="slagwerk" type="slagwerkType" />
<slagwerk> <naam> vibrafoon </naam> <materiaal> metaal </materiaal></slagwerk>
Samengesteld typesDatatype
Enkelvoudig Samengesteld
GemengdSamengesteldEnkelvoudigLeegInhoud:
All Choose Sequence
<xsd:complexType name="instrumentType"> <xsd:choose> <xsd:element name="houtblazer" type="string" /> <xsd:element name="koperblazer" type="string" /> <xsd:element name="slagwerk" type="string" /> </xsd:choose></xsd:complexType>
<instrument> <slagwerk>marimba</slagwerk></instrument>
<xsd:complexType name="instrumentType"> <xsd:all> <xsd:element name="name" type="string" /> <xsd:element name="soort" type="string" /> <xsd:element name="materiaal" type="string" /> </xsd:all></xsd:complexType>
<instrument> <soort> blaas </soort> <materiaal> koper </materiaal> <naam> hoorn </naam></instrument>
<xsd:complexType name="instrumentType"> <xsd:sequence> <xsd:element name="name" type="string" /> <xsd:element name="soort" type="string" /> <xsd:element name="materiaal" type="string" /> </xsd:sequence></xsd:complexType>
<instrument><naam> hoorn </naam>
<soort> blaas </soort><materiaal> koper </materiaal>
</instrument>
Aantal voorkomens<xsd:complexType name= "noten"> <xsd:sequence> <xsd:element name="noot" type="string" minOccurs="0" maxOccurs="16"/> </xsd:sequence></xsd:complexType><xsd:element name="maat" type= "noten" >
<maat> <noot>do</noot> <noot>re</noot> </maat>
Samengesteld typesDatatype
Enkelvoudig Samengesteld
GemengdSamengesteldEnkelvoudigLeegInhoud:
Element dat zowel andere elementen als gewone tekst bevat
Gemengde inhoud<xsd:element name="aanspreking"> <xsd:complexType mixed = "true"> <xsd:sequence> <xsd:element name="naam" /> </xsd:sequence> </xsd:complexType></xsd:element>
<aanspreking> Beste mevrouw <naam>Tack</naam>,</aanspreking>
DatatypesDatatype
Enkelvoudig Samengesteld
GemengdSamengesteldEnkelvoudigLeeg
Ingebouwd Gebruiker
Attributen
• Een element met een attribuut moet een samengesteld type hebben
• Een attribuut zelf moet een enkelvoudig type hebben
<xs:element name="schoen"> <xs:complexType> <xs:attribute name="maat" type="xs:integer"> </xs:complexType></xs:element>
Attributen
<xsd:attribute name="genre" type="xsd:string" use="required" />
• Default en vaste waardes
<xsd:attribute name="genre" type="xsd:string" default="hardrock" />
<liedje> = <liedje genre="hardrock">
• Attributen zijn normaalgezien optioneel
Groepen
<xsd:group name="aliasgroep"> <xsd:sequence> <xsd:element name="artiestennaam" type="xsd:string"/> <xsd:element name="echte-naam" minOccurs="0" type="xsd:string" /> </xsd:sequence></xsd:group>
Definiëren
Groepen
<xsd:element name="artiest"> <xsd:sequence> <xsd:group ref="aliasgroep" /> <xsd:element name="manager" type="xsd:string" /> </xsd:sequence></xsd:element>
Gebruiken
Uitbreidbare schema’s
• Om schema’s later te kunnen aanvullen of verschillende schema’s te combineren
<xsd:any> ipv. <xsd:element>
<xsd:anyAttribute> ipv. <xsd:attribute>