2. Vad är XML Schemas XML Schemas gör samma sak som DTDer fast bättre dvs med XML Schemas går det att definiera XML-vokabulärer och det går att validera instansdokument mot dessa schemas. XML Schemas är en W3C-rekommendation sedan 2001-05-02.
3. Varför XML Schemas 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.
4. Namespace XML Schemas har namespacen http://www.w3.org/2001/XMLSchema Prefixet brukar vara xsd (XML Schema Definition)
5. Simple Types vs Complex Types Som nämndes i DTD-föreläsningen: 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. Exempel är string, date, int, duration. Attribut innehåller Simple Content. Complex Content är innehåll som innehåller andra element.
6. Simple Types vs Complex Types (2) 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:complexType
8. Exempel <xsd:simpleType name=”positiveFloat”> <xsd:restriction base=”xsd:float”> <xsd:minExclusive value=”0”/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name=”myBoolean”> <xsd:restriction base=”xsd:string”> <xsd:enumeration value=”true”/> <xsd:enumeration value=”false”/> </xsd:restriction> </xsd:simpleType> Typdeklarationer simpleType 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. Facets
9. Listor (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 Exempel <xsd:simpleType name=”integerList”> <xsd:list itemType name=”xsd:int”/> </xsd:simpleType>
10. Regular Expressions (simpleType) Godtyckliga ”regular expressions” kan skapas genom att använda en facet som heter pattern som begränsning på en sträng. Exempel <xsd:simpleType name=”registrationPlate”> <xsd:restriction base=”xsd:string” /> <xsd:pattern value=”[A-Z]{3}\d{3}”/> </xsd:restriction> </xsd:simpleType>
11. Unioner (simpleType) Det går även att skapa datatyper som är unionen av två eller flera andra datatyper. Detta görs med xsd:union Exempel <xsd:simpleType name=”ingegerOrDate”> <xsd:union membertypes= ”xsd:int xsd:date”/> </xsd:simpleType>
13. DTD <!ELEMENT person (firstname,lastname,phone)> <!ELEMENT firstname (#PCDATA)> <!ELEMENT lastname (#PCDATA)> <!ELEMENT phone (#PCDATA)> Motsvarande XML Schema <xsd:complexType name=”person”> <xsd:sequence> <xsd:element name=”firstname” type=”xsd:string”/> <xsd:element name=”lastname” type=”xsd:string”/> <xsd:element name=”phone” type=”phone”/> </xsd:sequence> </xsd:complexType> <xsd:simpleType name=”phone”> [. . . Deklaration av phone …] </xsd:simpleType> complexType (exempel) Här deklareras element för första gången En annan namespace
14. Choice Val av ett element ur en mängd görs med xsd:choice Exempel 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> </xsd:complexType>
15. Mixed content Blandat text och element-innehåll kan erhållas genom attributet mixed=”true” infogad på en complexType 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. Exempel DTD <!ELEMENT mixedElement (#PCDATA | name)*> <!ELEMENT name (#PCDATA)> Motsvarande XML Schema <xsd:complexType name=”mixedElement” mixed=”true”> <xsd:sequence> <xsd:element name=”name” type=”xsd:string”/> </xsd:sequence> </xsd:complexType>
16. Binda element till en typ Vi har (nästan) bara deklarerat typer än så länge, inte element. Flera element kan bindas till samma typ. Exempel <xsd:complexType name=”person”> <xsd:sequence> <xsd:element name=”firstname” type=”xsd:string”/> <xsd:element name=”lastname” type=”xsd:string”/> </xsd:sequence> </xsd:complexType> <xsd:element name=”teacher” type=”person”/> <xsd:element name=”student” type=”person”/>
17. Ett elements scope 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.
18. Ett elements scope (2) Globala/lokala element fungerar som globala/lokala 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.
19. Ett elements scope (3) Exempel: instans av kommande schema <complaint> <comment>En kommentar</comment> <comment> <commentID>ID17</commentID> <comment> En till kommentar av annan typ </comment> </comment> </complaint>
21. 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
22. *, + och ? Hur uttrycker man repetitionsoperatorer som *, + och ? som finns i DTD-syntax? Svar: Med attributen minOccurs och maxOccurs <!ELEMENT foo (bar?) > <xsd:complexType name=”foo”> <xsd:element ref=”bar” minOccurs=”0” maxOccurs=”1”/> </xsd:complexType> <!ELEMENT foo (bar*) > <xsd:complexType name=”foo”> <xsd:element ref=”bar” minOccurs=”0” maxOccurs=”unbounded”/> </xsd:complexType> <!ELEMENT foo (bar+) > <xsd:complexType name=”foo”> <xsd:element ref=”bar” minOccurs=”1” maxOccurs=”unbounded”/> </xsd:complexType>
23. <xsd:complexType name=”foo”> <xsd:element ref=”bar” /> </xsd:complexType> <xsd:complexType name=”fooBar”> <xsd:complexContent> <xsd:extension base=”foo”/> <xsd:sequence> <xsd:element ref=”abc” /> <xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:element name=”fooBarElement” type=”fooBar”/> Arv - Extension Det är möjligt att ta en existerande complexType och definiera en ny complexType som innehåller fler element. Jfr OO subklasser Instans <fooBarElement> <bar></bar> <abc></abc> <fooBarElement> Utvidgningarna läggs alltid till sist, efter elementen i ursprungselementet.
24. Abstrakta typer 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:sequence> <xsd:element name=”firstname” type=”xsd:string”/> <xsd:element name=”lastname” type=”xsd:string”/> </xsd:sequence> </xsd:complexType> <xsd:complexType name=”teacher”/> <complexContent> <xsd:extension base=”person”> <xsd:sequence> <xsd:element name=”empNo” type=”xsd:string”/> </xsd:sequence> </xsd:extension> </complexContent> </xsd:complexType> <element name=”a” type=”person”/> fungerar ej <element name=”a” type=”teacher”/> fungerar
25. Substitutiongroups 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
26. <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”/> Substitutiongroups (2) Här kan man stoppa in PrintingPress istället.
27. 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=”test:person”/>
28. Sammanfattning och fortsättning Schemas används till samma saker som en DTD, men ger betydligt bättre kontroll att specificera olika datatyper, uttrycka mer komplexa relationer och dataabstraktioner. Nu kan du börja på XML Schema-laborationen, som dock är betydligt svårare än DTD-laborationen.