Vad är XML Schemas XML Schemas XML Schemas gör samma sak som DTDer fast bättre dvs med XML Schemas går det att definiera XMLvokabulärer och det går att validera instansdokument mot dessa schemas. XML Schemas är en W3C-rekommendation sedan 2001-05-02. 2D1525 Programmering för interaktiva medier http://www.nada.kth.se/kurser/kth/2d1525/ 2001-09-06 Björn Hedin, NADA/KTH 2001 1 2001-09-06 Björn Hedin, NADA/KTH 2001 2 Varför XML Schmas Namespace Har bra stöd för datatyper (int, date, regulära uttryck, egendefinierade datatyper, listor mm). Har visst stöd för objektorientering (arv och abstrakta element). Möjliggör kontextberoende elementnamn. Tillåter bättre repetitionsmöjigheter än +,* och? Definierad både som DTD och XML Schema. XML Schemas har namespacen http://www.w3.org/2001/xmlschema Prefixet brukar vara xsd (XML Schema Definition) 2001-09-06 Björn Hedin, NADA/KTH 2001 3 2001-09-06 Björn Hedin, NADA/KTH 2001 4
Simlpe Types vs Complex Types Ett element kan antingen ha Simple Content eller Complex Content. Innehållet kallas för content model. Simple Content är innehåll som inte innehåller andra element eller attribut. är string, date, int, duration. Attribut innehåller Simple Content. Complex Content är innehåll som innehåller andra element. 2001-09-06 Björn Hedin, NADA/KTH 2001 5 Simpe Types vs Complex Types Alla element har en type som anger dess content model. Det finns ett antal fördefinierade simple types, t.ex. xsd:string och xsd:int. Det går dock att definiera egna simple types, t.ex. heltal mellan 17 och 4711. Görs med xsd:simpletype Alla complex types måste definieras med xsd:compextype 2001-09-06 Björn Hedin, NADA/KTH 2001 6 Några fördefinierade datatyper (simpletypes) Typdeklarationer simpletype xsd:string xsd:int xsd:positiveinteger xsd:short xsd:double xsd:boolean xsd:datetime xsd:duration xsd:name xsd:qname xsd:anyuri xsd:language xsd:id xsd:idref xsd:idrefs xsd:nmtoken Nya datatyper kan skapas med xsd:simpletype. Dessa är alltid begränsningar av en existerande datatyp. Begränsningarna kallas facets. Olika datatyper tillåter olika facets. <xsd:simpletype name= positivefloat > <xsd:restriction base= xsd:float > <xsd:minexclusive value= 0 /> </xsd:restriction> Facets <xsd:simpletype name= myboolean > <xsd:restriction base= xsd:string > <xsd:enumeration value= true /> <xsd:enumeration value= false /> </xsd:restriction> 2001-09-06 Björn Hedin, NADA/KTH 2001 7 2001-09-06 Björn Hedin, NADA/KTH 2001 8
Listor (simpletype) Regular Expressions (simpletype) NMTOKENS kan användas för listor. För att skapa mer restriktiva listor, t.ex. listor av positiva flyttal, kan xsd:list användas <xsd:simpletype name= integerlist > <xsd:list itemtype name= xsd:int /> Godtyckliga regular expressions kan skapas genom att använda en facet som heter pattern som begränsning på en sträng. <xsd:simpletype name= registrationplate > <xsd:restriction base= xsd:string /> <xsd:pattern value= [A-Z]{3}\d{3} /> </xsd:restriction> 2001-09-06 Björn Hedin, NADA/KTH 2001 9 2001-09-06 Björn Hedin, NADA/KTH 2001 10 Unioner (simpletype) complextype Det går även att skapa datatyper som är unionen av två eller flera andra datatyper. Detta görs med xsd:union <xsd:simpletype name= ingegerordate > <xsd:union membertypes= xsd:int xsd:date /> xsd:compextype används för att deklarera element som ska ha barn-element och/eller attribut. Sekvenser anges med xsd:sequence DTD <!ELEMENT person (firstname,lastname,phone)> <!ELEMENT firstname (#PCDATA)> <!ELEMENT lastname (#PCDATA)> <!ELEMENT phone (#PCDATA)> Motsvarande XML Schema <xsd:complextype name= person > <xsd:element name= firstname type= xsd:string /> <xsd:element name= lastname type= xsd:string /> <xsd:element name= phone type= phone /> <xsd:simpletype name= phone > [... Deklaration av phone ] 2001-09-06 Björn Hedin, NADA/KTH 2001 11 2001-09-06 Björn Hedin, NADA/KTH 2001 12
Choice Mixed content Val av ett element ur en mängd görs med xsd:choice DTD <!ELEMENT fooorbar (foo bar)> <!ELEMENT foo (#PCDATA)> <!ELEMENT bar (#PCDATA)> Motsvarande XML Schema <xsd:complextype name= fooorbar > <xsd:choice> <xsd:element name= foo type= xsd:string /> <xsd:element name= bar type= xsd:string /> </xsd:choice> Blandat text och element-innehåll kan erhållas genom attributet mixed= true infogad på en complextype DTD <!ELEMENT mixedelement (#PCDATA name)*> <!ELEMENT name (#PCDATA)> Motsvarande XML Schema <xsd:complextype name= mixedelement mixed= true > <xsd:element name= name type= xsd:string /> Observera att även om man endast endast vill ha ett element i en content model måste man definiera en sequence eller ett choice med ett element. 2001-09-06 Björn Hedin, NADA/KTH 2001 13 2001-09-06 Björn Hedin, NADA/KTH 2001 14 Binda element till en typ Ett elements scope Vi har bara deklarerat typer än så länge, inte element. Flera element kan bindas till samma typ. <xsd:complextype name= person > <xsd:element name= firstname type= xsd:string /> <xsd:element name= lastname type= xsd:string /> <xsd:element name= teacher type= person /> <xsd:element name= student type= person /> Till skillnad från en DTD kan man deklarera element som bara är giltiga i ett annat element. Det har vi gjort hittills. Det går även att deklarera globala element, som har giltighet i hela namespacen. Dessa måste vara deklarerade som barn till xsd:schema. 2001-09-06 Björn Hedin, NADA/KTH 2001 15 2001-09-06 Björn Hedin, NADA/KTH 2001 16
Ett elements scope (2) Ett elements scope (3) Globala/lokala element fungerar som lokala/globala variabler vad gäller scope. För att använda ett globalt element använder man attributet ref i stället för attributet name. : Schema <xsd:schema> <xsd:element name= comment type= commenttype /> <xsd:complextype name= commenttype > <xsd:element name= commentid type= xsd:id /> <xsd:element name= comment type= xsd:string /> <xsd:complextype name= complainttype > <xsd:element name= comment type= xsd:string /> <xsd:element ref= comment /> <xsd:element name= complaint type= complainttype /> </xsd:schema> : instans <complaint> <comment>en kommentar</comment> <comment> <commentid>id17</commentid> <comment> En till kommentar av annan typ </comment> </comment> </complaint> 2001-09-06 Björn Hedin, NADA/KTH 2001 17 2001-09-06 Björn Hedin, NADA/KTH 2001 18 Skillnad mellan DTD och XML Schema i instansdokument Vad blir det då för skillnad i instansdokumenten om man använder schemas istället för DTDer? Svar: Inga, utom möjligtvis referensen till var Schemat/DTDn befinner sig. Skillnaden är endast hur man uttrycker constraints och hur exakt man kan uttrycka constraints Hur uttrycker man repetitionsoperatorer som *, + och? som finns i DTD-syntax? Svar: Med attributen minoccurs och maxoccurs *, + och? <!ELEMENT foo (bar?) > <xsd:element ref= bar minoccurs= 0 maxoccurs= 1 /> <!ELEMENT foo (bar*) > <xsd:element ref= bar minoccurs= 0 maxoccurs= unbounded /> <!ELEMENT foo (bar+) > <xsd:element ref= bar minoccurs= 1 maxoccurs= unbounded /> 2001-09-06 Björn Hedin, NADA/KTH 2001 19 2001-09-06 Björn Hedin, NADA/KTH 2001 20
Arv - Extension Abstrakta typer Det är möjligt att ta en existerande complextype och definiera en ny complextype som innehåller fler element. Jfr OO subklasser <xsd:element ref= bar /> Instans <foobarelement> <bar></bar> <abc></abc> <foobarelement> <xsd:complextype name= foobar > <xsd:complexcontent> <xsd:extension base= foo /> <xsd:element ref= abc /> </xsd:extension> </xsd:complexcontent> <xsd:element name= foobarelement type= foobar /> Det går även att göra en datatyper som inget element direkt kan använda som datatyp. Det går däremot att extenda datatypen och använda de nya datatyperna till element. <xsd:complextype name= person abstract= true > <xsd:element name= firstname type= xsd:string /> <xsd:element name= lastname type= xsd:string /> <xsd:complextype name= teacher /> <complexcontent> <xsd:extension base= person > <xsd:element name= empno type= xsd:string /> </xsd:extension> </complexcontent> <element name= a type= person /> fungerar ej <element name= a type= teacher /> fungerar 2001-09-06 Björn Hedin, NADA/KTH 2001 21 2001-09-06 Björn Hedin, NADA/KTH 2001 22 Substitutiongroups Substitutiongruoups (2) Ibland vill man specificera att ett element e1 ska anses vara ekvivalent med ett annat element e2. e2 måste ha ärvt från samma datatyp som e1. Om detta är uppfyllt går det att ersätta e1 med e2 på positioner där e1 ska förekomma, förutsatt att man deklarerar det med en substitutiongroup <element name="printingpress" type="imf:abstractresourcetype" substitutiongroup="imf:abstract_resource"/> <complextype name="pathclasstype"> <sequence> <element ref="imf:abstract_resource" /> </sequence> </complextype> <element name= Path type= imf:pathclasstype /> Här kan man stoppa in PrintingPress istället. 2001-09-06 Björn Hedin, NADA/KTH 2001 23 2001-09-06 Björn Hedin, NADA/KTH 2001 24
Specificera ett schemas namespace Det går att i ett schema specificera schemats namespace. Detta görs med targetnamespace. Det går även att ha schemas som defaultnamespace <schema targetnamespace= http://www.demo.com/test xmlns:test= http://www.demo.com/test xmlns= http:///www.w3.org/2001/xmlschema > <complextype name= person > <sequence> <element name= firstname type= string /> <element name= lastname type= string /> </sequence> </complextype> <element name= student type= text:person /> 2001-09-06 Björn Hedin, NADA/KTH 2001 25