xml schemas

28
1 XML Schemas Som DTD fast bättre (och svårare)

Post on 21-Oct-2014

4.842 views

Category:

Technology


9 download

DESCRIPTION

XML Schemas

TRANSCRIPT

Page 1: XML Schemas

1

XML Schemas

Som DTD fast bättre (och svårare)

Page 2: XML Schemas

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.

Page 3: XML Schemas

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.

Page 4: XML Schemas

4

Namespace

• XML Schemas har namespacenhttp://www.w3.org/2001/XMLSchema

• Prefixet brukar vara xsd (XML Schema Definition)

Page 5: XML Schemas

5

Simple Types vsComplex 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.

Page 6: XML Schemas

6

Simple Types vsComplex 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

Page 7: XML Schemas

7

Några fördefinieradedatatyper (simpleTypes)

• 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

Page 8: XML Schemas

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>

Facets

TypdeklarationersimpleType

• 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.

Page 9: XML Schemas

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>

Page 10: XML Schemas

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>

Page 11: XML Schemas

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>

Page 12: XML Schemas

12

complexType

• xsd:complexType används för att deklarera element som ska ha barn-element och/eller attribut.

• Sekvenser anges med xsd:sequence

Page 13: XML Schemas

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>

Här deklareraselement för första gången

En annan namespace

complexType (exempel)

Page 14: XML Schemas

14

Choice

• Val av ett element ur en mängd görs med xsd:choice

ExempelDTD<!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>

Page 15: XML Schemas

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>

Page 16: XML Schemas

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”/>

Page 17: XML Schemas

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.

Page 18: XML Schemas

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.

Page 19: XML Schemas

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>

Page 20: XML Schemas

20

Ett elements scope (3)

Exempel: Schema för föregående instans

<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> <xsd:complexType name=”complaintType”> <xsd:sequence> <xsd:element name=”comment” type=”xsd:string”/> <xsd:element ref=”comment”/> </xsd:sequence> </xsd:complexType> <xsd:element name=”complaint” type=”complaintType”/></xsd:schema>

Page 21: XML Schemas

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

Page 22: XML Schemas

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>

Page 23: XML Schemas

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”/>

Instans<fooBarElement> <bar></bar> <abc></abc><fooBarElement>

Utvidgningarna läggs alltidtill sist, efter elementen i ursprungselementet.

Arv - Extension• Det är möjligt att

ta en existerande complexType och definiera en ny complexType som innehåller fler element.

• Jfr OO subklasser

Page 24: XML Schemas

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

Page 25: XML Schemas

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

Page 26: XML Schemas

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”/>

Här kan man stoppa in PrintingPress istället.

Substitutiongroups (2)

Page 27: XML Schemas

27

Specificera ettschemas 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”/>

Page 28: XML Schemas

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.