XML Schemas

3,436 views

Published on

XML Schemas

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,436
On SlideShare
0
From Embeds
0
Number of Embeds
28
Actions
Shares
0
Downloads
32
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

XML Schemas

  1. 1. XML Schemas Som DTD fast bättre (och svårare)
  2. 2. Vad är XML Schemas <ul><li>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. </li></ul><ul><li>XML Schemas är en W3C-rekommendation sedan 2001-05-02. </li></ul>
  3. 3. Varför XML Schemas <ul><li>Har bra stöd för datatyper (int, date, regulära uttryck, egendefinierade datatyper, listor mm). </li></ul><ul><li>Har visst stöd för ”objektorientering” (arv och abstrakta element). </li></ul><ul><li>Möjliggör kontextberoende elementnamn. </li></ul><ul><li>Tillåter bättre repetitionsmöjigheter än +,* och ? </li></ul><ul><li>Definierad både som DTD och XML Schema. </li></ul>
  4. 4. Namespace <ul><li>XML Schemas har namespacen http://www.w3.org/2001/XMLSchema </li></ul><ul><li>Prefixet brukar vara xsd (XML Schema Definition) </li></ul>
  5. 5. Simple Types vs Complex Types <ul><li>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”. </li></ul><ul><li>Simple Content är innehåll som inte innehåller andra element eller attribut. Exempel är string, date, int, duration. Attribut innehåller Simple Content. </li></ul><ul><li>Complex Content är innehåll som innehåller andra element. </li></ul>
  6. 6. Simple Types vs Complex Types (2) <ul><li>Alla element har en ”type” som anger dess ”content model”. </li></ul><ul><li>Det finns ett antal fördefinierade ”simple types”, t.ex. xsd:string och xsd:int . </li></ul><ul><li>Det går dock att definiera egna simple types, t.ex. heltal mellan 17 och 4711. Görs med xsd:simpleType </li></ul><ul><li>Alla complex types måste definieras med xsd:complexType </li></ul>
  7. 7. Några fördefinierade datatyper (simpleTypes) <ul><li>xsd:string </li></ul><ul><li>xsd:int </li></ul><ul><li>xsd:positiveInteger </li></ul><ul><li>xsd:short </li></ul><ul><li>xsd:double </li></ul><ul><li>xsd:boolean </li></ul><ul><li>xsd:dateTime </li></ul><ul><li>xsd:duration </li></ul><ul><li>xsd:name </li></ul><ul><li>xsd:Qname </li></ul><ul><li>xsd:anyuri </li></ul><ul><li>xsd:language </li></ul><ul><li>xsd:id </li></ul><ul><li>xsd:idref </li></ul><ul><li>xsd:idrefs </li></ul><ul><li>xsd:NMTOKEN </li></ul>
  8. 8. <ul><li>Exempel </li></ul><ul><li><xsd:simpleType name=”positiveFloat”> </li></ul><ul><li><xsd:restriction base=”xsd:float”> </li></ul><ul><li><xsd:minExclusive value=”0”/> </li></ul><ul><li></xsd:restriction> </li></ul><ul><li></xsd:simpleType> </li></ul><ul><li><xsd:simpleType name=”myBoolean”> </li></ul><ul><li><xsd:restriction base=”xsd:string”> </li></ul><ul><li><xsd:enumeration value=”true”/> </li></ul><ul><li><xsd:enumeration value=”false”/> </li></ul><ul><li></xsd:restriction> </li></ul><ul><li></xsd:simpleType> </li></ul>Typdeklarationer simpleType <ul><li>Nya datatyper kan skapas med xsd:simpleType. </li></ul><ul><li>Dessa är alltid begränsningar av en existerande datatyp. </li></ul><ul><li>Begränsningarna kallas ”facets”. Olika datatyper tillåter olika facets. </li></ul>Facets
  9. 9. Listor (simpleType) <ul><li>NMTOKENS kan användas för listor. </li></ul><ul><li>För att skapa mer restriktiva listor, t.ex. listor av positiva flyttal, kan xsd:list användas </li></ul><ul><li>Exempel </li></ul><ul><li><xsd:simpleType name=”integerList”> </li></ul><ul><li><xsd:list itemType name=”xsd:int”/> </li></ul><ul><li></xsd:simpleType> </li></ul>
  10. 10. Regular Expressions (simpleType) <ul><li>Godtyckliga ”regular expressions” kan skapas genom att använda en facet som heter pattern som begränsning på en sträng. </li></ul><ul><li>Exempel </li></ul><ul><li><xsd:simpleType name=”registrationPlate”> </li></ul><ul><li><xsd:restriction base=”xsd:string” /> </li></ul><ul><li><xsd:pattern value=”[A-Z]{3}d{3}”/> </li></ul><ul><li></xsd:restriction> </li></ul><ul><li></xsd:simpleType> </li></ul>
  11. 11. Unioner (simpleType) <ul><li>Det går även att skapa datatyper som är unionen av två eller flera andra datatyper. </li></ul><ul><li>Detta görs med xsd:union </li></ul><ul><li>Exempel </li></ul><ul><li><xsd:simpleType name=”ingegerOrDate”> </li></ul><ul><li><xsd:union </li></ul><ul><li>membertypes= ”xsd:int </li></ul><ul><li>xsd:date”/> </li></ul><ul><li></xsd:simpleType> </li></ul>
  12. 12. complexType <ul><li>xsd:complexType används för att deklarera element som ska ha barn-element och/eller attribut. </li></ul><ul><li>Sekvenser anges med xsd:sequence </li></ul>
  13. 13. <ul><li>DTD </li></ul><ul><li><!ELEMENT person (firstname,lastname,phone)> </li></ul><ul><li><!ELEMENT firstname (#PCDATA)> </li></ul><ul><li><!ELEMENT lastname (#PCDATA)> </li></ul><ul><li><!ELEMENT phone (#PCDATA)> </li></ul><ul><li>Motsvarande XML Schema </li></ul><ul><li><xsd:complexType name=”person”> </li></ul><ul><li><xsd:sequence> </li></ul><ul><li><xsd:element name=”firstname” type=”xsd:string”/> </li></ul><ul><li><xsd:element name=”lastname” type=”xsd:string”/> </li></ul><ul><li><xsd:element name=”phone” type=”phone”/> </li></ul><ul><li></xsd:sequence> </li></ul><ul><li></xsd:complexType> </li></ul><ul><li><xsd:simpleType name=”phone”> </li></ul><ul><li>[. . . Deklaration av phone …] </li></ul><ul><li></xsd:simpleType> </li></ul>complexType (exempel) Här deklareras element för första gången En annan namespace
  14. 14. Choice <ul><li>Val av ett element ur en mängd görs med xsd:choice </li></ul><ul><li>Exempel </li></ul><ul><li>DTD </li></ul><ul><li><!ELEMENT fooOrBar (foo | bar)> </li></ul><ul><li><!ELEMENT foo (#PCDATA)> </li></ul><ul><li><!ELEMENT bar (#PCDATA)> </li></ul><ul><li>Motsvarande XML Schema </li></ul><ul><li><xsd:complexType name=”fooOrBar”> </li></ul><ul><li><xsd:choice> </li></ul><ul><li><xsd:element name=”foo” type=”xsd:string”/> </li></ul><ul><li><xsd:element name=”bar” type=”xsd:string”/> </li></ul><ul><li></xsd:choice> </li></ul><ul><li></xsd:complexType> </li></ul>
  15. 15. Mixed content <ul><li>Blandat text och element-innehåll kan erhållas genom attributet mixed=”true” infogad på en complexType </li></ul><ul><li>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. </li></ul><ul><li>Exempel DTD </li></ul><ul><li><!ELEMENT mixedElement (#PCDATA | name)*> </li></ul><ul><li><!ELEMENT name (#PCDATA)> </li></ul><ul><li>Motsvarande XML Schema </li></ul><ul><li><xsd:complexType name=”mixedElement” mixed=”true”> </li></ul><ul><li><xsd:sequence> </li></ul><ul><li><xsd:element name=”name” type=”xsd:string”/> </li></ul><ul><li></xsd:sequence> </li></ul><ul><li></xsd:complexType> </li></ul>
  16. 16. Binda element till en typ <ul><li>Vi har (nästan) bara deklarerat typer än så länge, inte element. </li></ul><ul><li>Flera element kan bindas till samma typ. </li></ul><ul><li>Exempel </li></ul><ul><li><xsd:complexType name=”person”> </li></ul><ul><li><xsd:sequence> </li></ul><ul><li><xsd:element name=”firstname” type=”xsd:string”/> </li></ul><ul><li><xsd:element name=”lastname” type=”xsd:string”/> </li></ul><ul><li></xsd:sequence> </li></ul><ul><li></xsd:complexType> </li></ul><ul><li><xsd:element name=”teacher” type=”person”/> </li></ul><ul><li><xsd:element name=”student” type=”person”/> </li></ul>
  17. 17. Ett elements scope <ul><li>Till skillnad från en DTD kan man deklarera element som bara är giltiga i ett annat element . </li></ul><ul><li>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. </li></ul>
  18. 18. Ett elements scope (2) <ul><li>Globala/lokala element fungerar som globala/lokala variabler vad gäller scope. </li></ul><ul><li>För att använda ett globalt element använder man attributet ref i stället för attributet name. </li></ul>
  19. 19. Ett elements scope (3) <ul><li>Exempel: instans av kommande schema </li></ul><ul><li><complaint> </li></ul><ul><li><comment>En kommentar</comment> </li></ul><ul><li><comment> </li></ul><ul><li><commentID>ID17</commentID> </li></ul><ul><li><comment> </li></ul><ul><li>En till kommentar av annan typ </li></ul><ul><li></comment> </li></ul><ul><li></comment> </li></ul><ul><li></complaint> </li></ul>
  20. 20. Ett elements scope (3) <ul><li>Exempel: Schema för föregående instans </li></ul><ul><li><xsd:schema> </li></ul><ul><li><xsd:element name=”comment” type=”commentType”/> </li></ul><ul><li><xsd:complexType name=”commentType”> </li></ul><ul><li><xsd:element name=”commentID” type=”xsd:ID”/> </li></ul><ul><li><xsd:element name=”comment” type=”xsd:string”/> </li></ul><ul><li></xsd:complexType> </li></ul><ul><li><xsd:complexType name=”complaintType”> </li></ul><ul><li><xsd:sequence> </li></ul><ul><li><xsd:element name=”comment” type=”xsd:string”/> </li></ul><ul><li><xsd:element ref=”comment”/> </li></ul><ul><li></xsd:sequence> </li></ul><ul><li></xsd:complexType> </li></ul><ul><li><xsd:element name=”complaint” type=”complaintType”/> </li></ul><ul><li></xsd:schema> </li></ul>
  21. 21. Skillnad mellan DTD och XML Schema i instansdokument <ul><li>Vad blir det då för skillnad i instansdokumenten om man använder schemas istället för DTDer? </li></ul><ul><li>Svar: Inga, utom möjligtvis referensen till var Schemat/DTDn befinner sig. </li></ul><ul><li>Skillnaden är endast hur man uttrycker constraints och hur exakt man kan uttrycka constraints </li></ul>
  22. 22. *, + och ? <ul><li>Hur uttrycker man repetitionsoperatorer som *, + och ? som finns i DTD-syntax? </li></ul><ul><li>Svar: Med attributen minOccurs och maxOccurs </li></ul><ul><li><!ELEMENT foo (bar?) > </li></ul><ul><li><xsd:complexType name=”foo”> </li></ul><ul><li><xsd:element ref=”bar” minOccurs=”0” maxOccurs=”1”/> </li></ul><ul><li></xsd:complexType> </li></ul><ul><li><!ELEMENT foo (bar*) > </li></ul><ul><li><xsd:complexType name=”foo”> </li></ul><ul><li><xsd:element ref=”bar” minOccurs=”0” maxOccurs=”unbounded”/> </li></ul><ul><li></xsd:complexType> </li></ul><ul><li><!ELEMENT foo (bar+) > </li></ul><ul><li><xsd:complexType name=”foo”> </li></ul><ul><li><xsd:element ref=”bar” minOccurs=”1” maxOccurs=”unbounded”/> </li></ul><ul><li></xsd:complexType> </li></ul>
  23. 23. <ul><li><xsd:complexType name=”foo”> </li></ul><ul><li><xsd:element ref=”bar” /> </li></ul><ul><li></xsd:complexType> </li></ul><ul><li><xsd:complexType name=”fooBar”> </li></ul><ul><li><xsd:complexContent> </li></ul><ul><li><xsd:extension base=”foo”/> </li></ul><ul><li><xsd:sequence> </li></ul><ul><li><xsd:element ref=”abc” /> </li></ul><ul><li><xsd:sequence> </li></ul><ul><li></xsd:extension> </li></ul><ul><li></xsd:complexContent> </li></ul><ul><li></xsd:complexType> </li></ul><ul><li><xsd:element name=”fooBarElement” type=”fooBar”/> </li></ul>Arv - Extension <ul><li>Det är möjligt att ta en existerande complexType och definiera en ny complexType som innehåller fler element. </li></ul><ul><li>Jfr OO subklasser </li></ul>Instans <fooBarElement> <bar></bar> <abc></abc> <fooBarElement> Utvidgningarna läggs alltid till sist, efter elementen i ursprungselementet.
  24. 24. Abstrakta typer <ul><li>Det går även att göra en datatyper som inget element direkt kan använda som datatyp. </li></ul><ul><li>Det går däremot att ”extenda” datatypen och använda de nya datatyperna till element. </li></ul><ul><li><xsd:complexType name=”person” abstract=”true”> </li></ul><ul><li><xsd:sequence> </li></ul><ul><li><xsd:element name=”firstname” type=”xsd:string”/> </li></ul><ul><li><xsd:element name=”lastname” type=”xsd:string”/> </li></ul><ul><li></xsd:sequence> </li></ul><ul><li></xsd:complexType> </li></ul><ul><li><xsd:complexType name=”teacher”/> </li></ul><ul><li><complexContent> </li></ul><ul><li><xsd:extension base=”person”> </li></ul><ul><li><xsd:sequence> </li></ul><ul><li><xsd:element name=”empNo” type=”xsd:string”/> </li></ul><ul><li></xsd:sequence> </li></ul><ul><li></xsd:extension> </li></ul><ul><li></complexContent> </li></ul><ul><li></xsd:complexType> </li></ul><ul><li><element name=”a” type=”person”/> fungerar ej </li></ul><ul><li><element name=”a” type=”teacher”/> fungerar </li></ul>
  25. 25. Substitutiongroups <ul><li>Ibland vill man specificera att ett element e1 ska anses vara ”ekvivalent” med ett annat element e2. </li></ul><ul><li>e2 måste ha ”ärvt” från samma datatyp som e1. </li></ul><ul><li>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 </li></ul>
  26. 26. <ul><li><element </li></ul><ul><li>name=&quot;PrintingPress&quot; </li></ul><ul><li>type=&quot;imf:AbstractResourceType&quot; </li></ul><ul><li>substitutionGroup=&quot;imf:abstract_resource&quot;/> </li></ul><ul><li><complexType name=&quot;PathClassType&quot;> </li></ul><ul><li><sequence> </li></ul><ul><li><element ref=&quot;imf:abstract_resource&quot; /> </li></ul><ul><li></sequence> </li></ul><ul><li></complexType> </li></ul><ul><li><element name=”Path” type=”imf:PathClassType”/> </li></ul>Substitutiongroups (2) Här kan man stoppa in PrintingPress istället.
  27. 27. Specificera ett schemas namespace <ul><li>Det går att i ett schema specificera schemats namespace </li></ul><ul><li>Detta görs med targetNamespace. </li></ul><ul><li>Det går även att ha schemas som defaultnamespace </li></ul><ul><li><schema targetNamespace=” http://www.demo.com/test” xmlns:test=” http://www.demo.com/test” xmlns=” http:///www.w3.org/2001/XMLSchema” > </li></ul><ul><li><complexType name=”person”> </li></ul><ul><li><sequence> </li></ul><ul><li><element name=”firstname” type=”string”/> </li></ul><ul><li><element name=”lastname” type=”string”/> </li></ul><ul><li></sequence> </li></ul><ul><li></complexType> </li></ul><ul><li><element name=”student” type=”test:person”/> </li></ul>
  28. 28. Sammanfattning och fortsättning <ul><li>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. </li></ul><ul><li>Nu kan du börja på XML Schema-laborationen, som dock är betydligt svårare än DTD-laborationen. </li></ul>

×