SlideShare a Scribd company logo
XML Schemas Som DTD fast bättre (och svårare)
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.
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.
Namespace XML Schemas har namespacen http://www.w3.org/2001/XMLSchema Prefixet brukar vara xsd (XML Schema Definition)
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.
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
Några fördefinierade datatyper (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
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
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>
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>
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>
complexType xsd:complexType 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: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
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>
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>
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”/>
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.
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.
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>
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>
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
*, + 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>
<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.
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
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
<element  name=&quot;PrintingPress&quot;  type=&quot;imf:AbstractResourceType&quot;  substitutionGroup=&quot;imf:abstract_resource&quot;/> <complexType name=&quot;PathClassType&quot;> <sequence> <element ref=&quot;imf:abstract_resource&quot; /> </sequence> </complexType> <element name=”Path” type=”imf:PathClassType”/> Substitutiongroups (2) Här kan man stoppa in PrintingPress istället.
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”/>
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.

More Related Content

PPT
XML och DTD
PPT
Web publishing and XHTML
PPT
Info om masterval och kexjobb, medieteknik KTH VT2013
PPT
Podcastseminarium
PPT
CSS
PPT
PHP och MySQL
PDF
AAHS-Newsletter-Winter-2014
PPT
RDF och RSS
XML och DTD
Web publishing and XHTML
Info om masterval och kexjobb, medieteknik KTH VT2013
Podcastseminarium
CSS
PHP och MySQL
AAHS-Newsletter-Winter-2014
RDF och RSS

Viewers also liked (9)

PPT
K-Seminar on mobile learning
PPT
Namespaces
PPT
Info masterval och kexjobb i medieteknik KTH HT 2011
PPT
LatEpi_final 6.30
PDF
AAHS-Newsletter-Winter-2011
PPT
synergist splint for flexor tendon repair
PPT
Second Life
PPT
Lailey's presentation
PPT
Latest In Hand Surgery3
K-Seminar on mobile learning
Namespaces
Info masterval och kexjobb i medieteknik KTH HT 2011
LatEpi_final 6.30
AAHS-Newsletter-Winter-2011
synergist splint for flexor tendon repair
Second Life
Lailey's presentation
Latest In Hand Surgery3
Ad

Similar to XML Schemas (6)

PPT
XSLT
PPT
XSL-FO
PDF
JavaScript och DOM
PPTX
JavaScript - Intro
PPT
CSS
PDF
JavaScript + DOM
XSLT
XSL-FO
JavaScript och DOM
JavaScript - Intro
CSS
JavaScript + DOM
Ad

More from bjornh (8)

PPT
Info kexjobb-2013-11-11
PPTX
Teaching procrastination - A way of helping students to improve their study h...
PPT
Info masterval medieteknik på KTH 2012-05-03
PPT
LIKT seminar on mobile learning
PPT
Location-based mLearning reminders
PPT
Web 2.0
PPT
Device Independence
PPT
Web 2.0
Info kexjobb-2013-11-11
Teaching procrastination - A way of helping students to improve their study h...
Info masterval medieteknik på KTH 2012-05-03
LIKT seminar on mobile learning
Location-based mLearning reminders
Web 2.0
Device Independence
Web 2.0

XML Schemas

  • 1. XML Schemas Som DTD fast bättre (och svårare)
  • 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
  • 7. Några fördefinierade datatyper (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
  • 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>
  • 12. complexType xsd:complexType används för att deklarera element som ska ha barn-element och/eller attribut. Sekvenser anges med xsd:sequence
  • 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>
  • 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>
  • 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=&quot;PrintingPress&quot; type=&quot;imf:AbstractResourceType&quot; substitutionGroup=&quot;imf:abstract_resource&quot;/> <complexType name=&quot;PathClassType&quot;> <sequence> <element ref=&quot;imf:abstract_resource&quot; /> </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.