Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 9. XML Schema ιαχείριση εδομένων στον Παγκόσμιο Ιστό Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων Τετάρτη 11 Ιαν 2017
Απαιτήσεις για XML Schema Αποτελεί την πρόταση (2001) του W3C για να αντικαταστήσει το DTD Αμέσως μετά την έγκριση της XML (και του DTD) ως W3C recommendation Xml Schema Requirements από το XML Schema Working Group (1999) Σχεδιαστικές αρχές Περισσότερο εκφραστικό από DTD Χρήση του XML notation Self-describing XML Schema W3C Recommendation (2001) Απλότητα Part 1: Structures Part 2: Datatypes Τεχνικές απαιτήσεις Υποστήριξη namespaces Τύποι δεδομένων που ορίζονται από το χρήστη Κληρονομικότητα (όπως σε αντικειμενοστρεφή μοντέλα) Evolution σχημάτων Embedded documentation Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 2
Τύποι και Δηλώσεις Ορισμός simple type Ορίζει μια οικογένεια από Unicode text strings Ισοδύναμα: περιγράφει text χωρίς markup Ορισμός complex type Ορίζει ένα content και attribute model Ισοδύναμα: περιγράφει text που μπορεί να περιέχει markup ήλωση element Συσχετίζει ένα element name με ένα simple ή complex type ήλωση attribute Συσχετίζει ένα attribute name με ένα simple type Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 3
Απλό Παράδειγμα Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 4
Δείγμα Έγκυρου XML Αρχείου Το παρακάτω element student ικανοποιεί όλους τους περιορισμούς που θέτει το προηγούμενο XML Schema Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 5
Παράδειγμα: XML Γλώσσα για Business Cards (1) Instance document john_doe.xml <b:card xmlns:b="http://businesscard.org"> <b:name>john Doe</b:name> <b:title>ceo, Widget Inc.</b:title> <b:email>john.doe@widget.com</b:email> <b:phone>(202) 555-1414</b:phone> <b:logo b:uri="widget.gif"/> </b:card> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 6
Παράδειγμα: XML Γλώσσα για Business Cards (2) Schema business_card.xsd <schema xmlns="http://www.w3.org/2001/xmlschema" xmlns:b="http://businesscard.org" targetnamespace="http://businesscard.org"> <element name="card" type="b:card_type"/> <element name="name" type="string"/> <element name="title" type="string"/> <element name="email" type="string"/> <element name="phone" type="string"/> <element name="logo" type="b:logo_type"/> <attribute name="uri" type="anyuri"/> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 7
Παράδειγμα: XML Γλώσσα για Business Cards (3) <complextype name="card_type"> <sequence> <element ref="b:name"/> <element ref="b:title"/> <element ref="b:email"/> <element ref="b:phone" minoccurs="0"/> <element ref="b:logo" minoccurs="0"/> </sequence> <complextype name="logo_type"> <attribute ref= b:uri" use="required"/> </schema> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 8
Σύνδεση Σχήματος με Instance Target namespace <b:card xmlns:b="http://businesscard.org xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://businesscard.org business_card.xsd"> <b:name>john Doe</b:name> <b:title>ceo, Widget Inc.</b:title> <b:email>john.doe@widget.com</b:email> <b:phone>(202) 555-1414</b:phone> <b:logo b:uri="widget.gif"/> </b:card> Schema document Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 9
Δηλώσεις Element και Attribute Παραδείγματα <element name="serialnumber" type="nonnegativeinteger"/> <attribute name= alcohol" type= r:percentage"/> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 10
Απλοί Τύποι Δεδομένων string: any Unicode string boolean: true, false, 1, 0 decimal: 3.1415 float: 6.02214199E23 double: 42E970 datetime: 2004-09-26T16:29:00-05:00 time: 16:29:00-05:00 date: 2004-09-26 hexbinary: 48656c6c6f0a base64binary: SGVsbG8K anyuri: http://www.brics.dk/ixwt/ QName: rcp:recipe, recipe Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 11
Παραγωγή Απλών Τύπων (1) Restriction Constraining facets length maxinclusive minlength maxexclusive maxlength mininclusive minexclusive pattern enumeration totaldigits whitespace fractiondigits Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 12
Παραδείγματα <simpletype name="score_from_0_to_100"> <restriction base="integer"> <mininclusive value="0"/> <maxinclusive value="100"/> </restriction> </simpletype> <simpletype name="percentage"> <restriction base="string"> <pattern value="([0-9] [1-9][0-9] 100)%"/> </restriction> </simpletype> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 13
Παραγωγή Απλών Τύπων (2) Λίστα <simpletype name="integerlist"> <list itemtype="integer"/> </simpletype> Αντιστοιχεί σε λίστες ακεραίων οι οποίοι χωρίζονται από whitespace Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 14
Παραγωγή Απλών Τύπων (3) Ένωση <simpletype name="boolean_or_decimal"> <union> <simpletype> <restriction base="boolean"/> </simpletype> <simpletype> <restriction base="decimal"/> </simpletype> </union> </simpletype> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 15
Built-In Derived Simple Types normalizedstring token language Name NCName ID IDREF integer nonnegativeinteger unsignedlong long int short byte... Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 16
Complex Types with Complex Contents Content model ως regular expressions Element reference <element ref= name /> Concatenation <sequence>... </sequence> Union (ExclusiveOr) <choice>... </choice> All (σαν το sequence, όμως δεν ενδιαφέρει η σειρά εμφάνισης) <all>... </all> Element wildcard: <any namespace=... processcontents=... /> Attribute reference: <attribute ref=... /> Attribute wildcard: <anyattribute namespace=... processcontents=... /> Cardinalities: minoccurs, maxoccurs, use Mixed content: mixed= true Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 17
Παράδειγμα <element name="order" type="n:order_type"/> <attribute name= id type= unsignedint /> <complextype name="order_type" mixed="true"> <choice> <element ref="n:address"/> <sequence> <element ref="n:email" minoccurs="0" maxoccurs="unbounded"/> <element ref="n:phone"/> </sequence> </choice> <attribute ref= n:id" use="required"/> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 18
Παραγωγή Complex Types με Simple Content <complextype name="category"> <simplecontent> <extension base="integer"> <attribute ref= r:class /> </extension> </simplecontent> Element με περιεχόμενο έναν ακέραιο και προαιρετικά attribute που λέγεται class <complextype name="restricted_category"> <simplecontent> <restriction base="n:category"> <totaldigits value="3"/> <attribute ref= r:class" use="required"/> </restriction> </simplecontent> <complextype name="extended_category"> <simplecontent> <extension base="n:category"> <attribute ref= r:kind"/> </extension> </simplecontent> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 19
Παραγωγή Complex Types με Complex Content <complextype name="basic_card_type"> <sequence> <element ref="b:name"/> </sequence> <complextype name="extended_type"> <complexcontent> <extension base= "b:basic_card_type"> <sequence> <element ref="b:title"/> <element ref="b:email" minoccurs="0"/> </sequence> </extension> </complexcontent> <complextype name="further_derived"> <complexcontent> <restriction base="b:extended_type"> <sequence> <element ref="b:name"/> <element ref="b:title"/> <element ref="b:email"/> </sequence> </restriction> </complexcontent> Προσοχή: το restriction δεν είναι το αντίθετο του extension Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 20
Global vs. Local Descriptions Global (toplevel) style: <element name="card type="b:card_type"/> <element name="name type="string"/> <complextype name="card_type"> <sequence> <element ref="b:name"/>... </sequence> Local (inlined) style: <element name="card"> <complextype> inlined <sequence> <element name="name" type="string"/>... </sequence> </element> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 21
Global vs. Local Descriptions Τα local type definitions είναι ανώνυμα Άρα δεν μπορούμε να αναφερόμαστε σε αυτά Τα local element/attribute declarations μπορούν να γίνουν overload Μια απλή μορφή context-sensitivity Ιδιαίτερα χρήσιμο για attributes! Μόνο globally declared elements μπορεί να είναι σημεία εκκίνησης για επικύρωση (π.χ. roots) Τα local definitions επιτρέπουν ένα εναλλακτικό μηχανισμό namespace semantics Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 22
Απαιτήσεις σε Complex Types ύο δηλώσεις elements με το ίδιο name που εμφανίζονται στο ίδιο complex type πρέπει να έχουν ίδιο τύπο <complextype name= some_type"> <choice> <element name= foo" type= string"/> <element name= foo" type= integer"/> </choice> Αυτή η απαίτηση επιτρέπει αποδοτική υλοποίηση Το all μπορεί να περιέχει element (π.χ. όχι sequence) Επομένως δεν μπορούμε να χρησιμοποιήσουμε το all για να λύσουμε το πρόβλημα με το comment στην RecipeML Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 23
Namespaces <schema targetnamespace="......> Μη παραδοσιακές χρήσεις namespaces Prefixes χρησιμοποιούνται και σε ορισμένα attribute values! Qualified vs. Unqualified Locals Εάν ενεργοποιηθούν, το όνομα ενός locally declared element ή attribute στο instance document δεν πρέπει να έχει namespace prefix (π.χ. το empty namespace URI) Ένα τέτοιο attribute ή element ανήκει στο element που έχει δηλωθεί στο global definition Μπορούμε να αλλάζουμε τη default συμπεριφορά χρησιμοποιώντας elementformdefault="qualified" Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 24
Qualified vs. Unqualified Locals Αν ενεργοποιηθεί το unqualified locals ε βάζουμε namespace prefix στο locally declared element ή attribute Ανήκει στο element που το περιβάλλει στο global definition Αν ενεργοποιηθεί το qualified locals Ένα locally declared attribute πρέπει να έχει namespace prefix elementformdefault, attributeformdefault qualified ή unqualified (default) Συνίσταται η χρήση <schema> elementformdefault= qualified </schema> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 25
Παράδειγμα Επιλέγοντας unqualified local attributes (default), μπορούμε να γράψουμε <complextype name="logo_type"> <attribute name= uri" type= anyuri use="required"/> Αντί για <element name="logo" type="b:logo_type"/> <attribute name="uri" type="anyuri"/>... <complextype name="logo_type"> <attribute ref= b:uri" use="required"/> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 26
Παράγωγοι Τύποι και Subsumption Υποθέτοντας ότι T είναι ένας τύπος Τ- παράγεται από τον Τ με restriction Τ+ παράγεται από τον Τ με extension Subsumption: όταν χρειαζόμαστε ένα instance του Τ Ένα Τ- instance μπορεί να χρησιμοποιηθεί στη θέση του (προφανές) Ένα Τ+ instance μπορεί να χρησιμοποιηθεί στη θέση του Εάν το instance έχει xsi:type= T+ (με xmlns:xsi="http://www.w3.org/2001/xmlschema-instance") Derivation, Instantiation και Subsumption μπορούν να περιοριστούν με final, abstract και block Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 27
Substitution Groups Αν υποθέσουμε ότι το D παράγεται από το Β (με ένα αριθμό βημάτων) Ε D είναι μια δήλωση element με τύπο D, και E B είναι μια δήλωση element με τύπο Β Εάν το Ε D είναι substitution group του E B, τότε ένα element Ε D μπορεί να χρησιμοποιηθεί οποτεδήποτε απαιτείται ένα Ε Β Subsumption με βάση δηλώσεις elements, όχι με βάση τύπους Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 28
Uniqueness, Keys, References <element name="w:widget" xmlns:w="http://www.widget.org"> <complextype>... <key name="my_widget_key"> <selector xpath="w:components/w:part"/> <field xpath="@manufacturer"/> <field xpath="w:info/@productid"/> </key> <keyref name="annotation_references" refer="w:my_widget_key"> <selector xpath=".//w:annotation"/> <field xpath="@manu"/> <field xpath="@prod"/> </keyref> </element> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 29
Άλλα Χαρακτηριστικά του XML Schema Groups Nil values Annotations Defaults and whitespace Modularization Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 30
RecipeML με XML Schema (1) <schema xmlns="http://www.w3.org/2001/xmlschema" xmlns:r="http://www.brics.dk/ixwt/recipes" targetnamespace="http://www.brics.dk/ixwt/recipes" elementformdefault="qualified"> <element name="collection"> <complextype> <sequence> <element name="description" type="string"/> <element ref="r:recipe" minoccurs="0" maxoccurs="unbounded"/> </sequence> <unique name="recipe-id-uniqueness"> <selector xpath=".//r:recipe"/> <field xpath="@id"/> </unique> <keyref name="recipe-references" refer="r:recipe-id-uniqueness"> <selector xpath=".//r:related"/> <field xpath="@ref"/> </keyref> </element> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 31
RecipeML με XML Schema (2) <element name="recipe"> <complextype> <sequence> <element name="title" type="string"/> <element name="date" type="string"/> <element ref="r:ingredient" minoccurs="0" maxoccurs="unbounded"/> <element ref="r:preparation"/> <element name="comment" type="string" minoccurs="0"/> <element ref="r:nutrition"/> <element ref="r:related" minoccurs="0" maxoccurs="unbounded"/> </sequence> <attribute name="id" type="nmtoken"/> </element> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 32
RecipeML με XML Schema (3) <element name="ingredient"> <complextype> <sequence minoccurs="0"> <element ref="r:ingredient" minoccurs="0" maxoccurs="unbounded"/> <element ref="r:preparation"/> </sequence> <attribute name="name" use="required"/> <attribute name="amount" use="optional"> <simpletype> <union> <simpletype> <restriction base="r:nonnegativedecimal"/> </simpletype> <simpletype> <restriction base="string"> <enumeration value="*"/> </restriction> </simpletype> </union> </simpletype> </attribute> <attribute name="unit" use="optional"/> </element> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 33
RecipeML με XML Schema (4) <element name="preparation"> <complextype> <sequence> <element name="step" type="string minoccurs="0 maxoccurs="unbounded"/> </sequence> </element> <element name="nutrition"> <complextype> <attribute name="calories" type="r:nonnegativedecimal use="required"/> <attribute name="protein" type="r:percentage" use="required"/> <attribute name="carbohydrates" type="r:percentage" use="required"/> <attribute name="fat" type="r:percentage" use="required"/> <attribute name="alcohol" type="r:percentage" use="optional"/> </element> <element name="related"> <complextype> <attribute name="ref" type="nmtoken" use="required"/> </element> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 34
RecipeML με XML Schema (5) <simpletype name="nonnegativedecimal"> <restriction base="decimal"> <mininclusive value="0"/> </restriction> </simpletype> <simpletype name="percentage"> <restriction base="string"> <pattern value="([0-9] [1-9][0-9] 100)%"/> </restriction> </simpletype> </schema> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 35
Προβλήματα με XML Schema Ακόμη και το XML Schema έχει περιορισμένη εκφραστικότητα calories should contain a non-negative number protein should contain a value on the form N% where N is between 0 and 100; comment should be allowed to appear anywhere in the contents of recipe unit should only be allowed in an elements where amount is also present nested ingredient elements should only be allowed when amount is absent Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 36
Περιορισμοί του XML Schema (1) 1. Οι λεπτομέρειες είναι εξαιρετικά πολύπλοκες 2. Οι δηλώσεις είναι κυρίως context-insensitive 3. Είναι αδύνατο να γραφεί μια πλήρης XML Schema περιγραφή του XML Schema 4. Όταν έχουμε mixed content, δεν μπορούν να επιβληθούν περιορισμοί στα character data 5. Τα unqualified local elements συνιστούν κακή πρακτική Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 37
Περιορισμοί του XML Schema (2) 6. εν υποστηρίζει απαίτηση για συγκεκριμένο root element 7. Τα element defaults δεν περιέχουν markup 8. To type είναι υπερβολικά πολύπλοκο 9. Ο xsi:type είναι προβληματικός 10.Τα simple type definitions είναι μη ευέλικτα Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 38
Ισχυρά Σημεία του XML Schema Υποστήριξη namespaces Τύποι δεδομένων (built-in και derived) Modularization Μηχανισμός παραγωγής τύπων Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 39
Πηγές Αναφοράς Anders Moller and Michael I. Schwartzbach An Introduction to XML and Web Technologies Addison-Wesley, January 2006, 568pp XML Schema Part 1: Structures http://www.w3.org/tr/xmlschema-1/ XML Schema Part 2: Datatypes http://www.w3.org/tr/xmlschema-2/ Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 40