610 likes | 688 Views
Τεχνολογίες XML. XML και DTD Υποστηρικτικές τεχνολογίες Γλώσσες ερωτήσεων. HTML. Χρησιμοποιεί tags ανάμεσα στο κείμενο... ...για να περιγράψει το layout της σελίδας <p> <b>Alan</b>, 42 years, <i>agb@abc.com</i>
E N D
XML και DTDΥποστηρικτικές τεχνολογίεςΓλώσσες ερωτήσεων
HTML • Χρησιμοποιεί tagsανάμεσα στο κείμενο... • ...για να περιγράψει το layoutτης σελίδας <p> <b>Alan</b>, 42 years, <i>agb@abc.com</i> • Δεν διευκολύνει άλλα προγράμματα να κατανοήσουν την δομή και το περιεχόμενο μιας σελίδας • Ο wrapper «σπάει» αν το italic <i> αλλάξει σε teletype <t> • Το πρόβλημα είναι οτι σχεδιάστηκε ειδικά για να περιγράψει την παρουσίαση και όχι το περιεχόμενο • Καθένας θα ήθελε να υπάρχει «ένα ακόμη tag» στην HTML προκειμένου να βοηθηθεί η δική του εφαρμογή
XML • Σχεδιάστηκε ειδικά για να περιγράψει το περιεχόμενο (content) και όχι την παρουσίαση μιας σελίδας • Βασικές διαφορές από την HTML • Μπορεί κανείς να ορίσει νέα tagsκατά βούληση • Ενα έγγραφο XML μπορεί προαιρετικά να περιέχει μια περιγραφή της γραμματικής του • Τα tags δομούν το περιεχόμενο <person><name>Kostas</name>…</person> • Το πως θα εμφανιστούν ορίζεται ξεχωριστά από κάποιο stylesheet (XSL)
XML (2) • Ο ρόλος της XML • Προτάθηκε σαν μια markup γλώσσα περιγραφής εγγράφων • Καταγωγή απο την SGML (ψηφιακές βιβλιοθήκες) • Εξελίσσεται όμως σε ένα παγκόσμιο πρότυπο για ανταλλαγή πληροφορίας • Αυτό τράβηξε το ενδιαφέρον της κοινότητας των ΒΔ • Βασικό συστατικό της XML είναι το element • Κείμενο που περικλείεται από ένα ζεύγος tags • Start-tag και end-tag (markups) • Εκτός από την λογική δομή (elements), τα tags περιγράφουν και την φυσική δομή (entities) <person> <name>Alan</name> <age>42</age> <email>alan@abc.com</email> <email>abrown@mail.com</email> </person>
Εlements και tags • Τι μπορεί να υπάρχει ανάμεσα στα start-tag και end-tag; • Απλό κείμενο • Αλλα elements • Οποιοδήποτε μίγμα των δύο παραπάνω ! • Τα tags στην XML: • Ορίζονται από τους χρήστες, δεν υπάρχουν προκαθορισμένα tags όπως στην HTML • Ανοίγουν και κλείνουν πάντα με την «σωστή» σειρά (σαν παρενθέσεις) • Εξαίρεση: empty tag, πχ. <married/> (το / στο τέλος) <married/> = <married></married> • Element, element content, και subelement
XML attributes • Ενα element μπορεί να περιέχει μηδέν ή περισσότερα attributes • Δεν σχετίζονται με τα attributes στις σχεσιακές βάσεις • Περιγράφουν ιδιότητες (properties) του element <product> <name language=“French”>trompette no 6</name> <price currency=“Euro”> 420.12 </price> <address format=“XL1245” language=“French”> <street>31 rue Croix-Bosset</street> <zip>92874</zip> </address> </product> • Οπως και τα elements, τα attributes ορίζονται από τον χρήστη
Attributes και elements • Διαφορές με elements: • Η τιμή του attribute είναι πάντα ένα string σε εισαγωγικά, ενώ το element μπορεί να περιέχει άλλα elements • Ενα element μπορεί να έχει το πολύ ένα attribute με ένα όνομα, ενώ μπορεί να έχει πολλά subelements με το ίδιο όνομα • Τα attributes: • Φανερώνουν την καταγωγή της XML σαν document markup γλώσσας • Εισάγουν κάποια δυσκολία στην ανταλλαγή πληροφορίας: αναπαράσταση σαν attribute ή σαν subelement; <person name=“Alan” age=“42” email=“agb@abc.com”/> <person age=“42”> <name>Alan</name> <email>agb@abc.com</email> </person>
ΧML και ημιδομημένα δεδομένα • Η XML είναι κατάλληλη για την αναπαράσταση ημιδομημένων δεδομένων • ssd-expression: {person: {name: “Alan”, age: 42, email: “agb@abc.com”}} • Αντίστοιχο XML: <person> <name>Alan</name> <age>42</age> <email>agb@abc.com</email> </person> • Διαφορές με ημιδομημένα δεδομένα: • Μοντέλο XML Graph, XML references, διάταξη (order), μίξη elements με κείμενο, επιπλέον στοιχεία της XML
XML Graph • Ενα μοντέλο για XML data: XML Graph • Οι κόμβοι αντιστοιχούν στα elements • Διαφορά με SSD Graph: οι ετικέτες είναι στους κόμβους • Εύκολη η μετατροπή, ιδίως αν έχουμε δένδρο • Μπορούμε να έχουμε γράφο; - ΝΑΙ
XML References • H XML έχει έναν μηχανισμό ώστε ένα element να μπορεί να «δείχνεται» από περισσότερους από έναν «πατέρες» • Ορίζοντας έτσι γράφο αντί για δένδρο • Ο μηχανισμός είναι attributes τύπου ID, IDREF, και IDREFS • Τα ID αναθέτουν ταυτότητες στα elements • Τα IDREF «δείχνουν» στα ID από άλλα elements, οπουδήποτε <state id=“s2” idrefs=“c2c7c12c32”>Nevada</state> ... <city id=“c7”> <cname>Carson City</cname> <state-of idref=“s2”/> </city> • Ποιάattributes είναι τύπου ID / IDREF; • Πάντως όχι κατ’ ανάγκη αυτά που λέγονται id / idref • Αλλά αυτά που ορίζονται από το DTD (στην συνέχεια)
Διάταξη • Τα δύο SSD είναι ισοδύναμα: {person: {firstname: “John”, lastname: “Smith”}} {person: {lastname: “Smith”, firstname: “John”}} • Ενώ τα δύο XML δεν είναι ισοδύναμα: <person><firstname>John</firstname> <lastname>Smith</lastname></person> <person><lastname>Smith</lastname> <firstname>John</firstname></person> • Τα XMLattributes δεν είναι διατεταγμένα • Τα παρακάτω είναι ισοδύναμα: <personfirstname=“John” lastname=“Smith”/> <personlastname=“Smith” firstname=“John”/> • Η απαίτηση για διάταξη δυσκολεύει την αποδοτική διαχείριση των δεδομένων XML • Συχνά η διάταξη αγνοείται σε εφαρμογές ανταλλαγής πληροφορίας
Μίξη elements και κειμένου • Το παρακάτω επιτρέπεται στην XML • Λέμε ότι το person έχει mixed content <person> This is my best friend <name>Alan</name> <age>42</age> I am not too sure about the following email <email>agb@abc.com</email> </person> • Δείχνει την εγγραφο-κεντρική καταγωγή της XML • Κάπως «αφύσικο» από την πλευρά των βάσεων δεδομένων • Προτιμούμε το element content
Επιπλέον στοιχεία της XML • Εγγραφο-κεντρικά στοιχεία που δεν χρειάζονται στην ανταλλαγή δεδομένων • Σχόλια <!– this is comment --> • Processing Instructions <?xml-stylesheet href=“book.css” type=“text/css”?> • Αρχική γραμμή <?xml version=“1.0”?> • Προαιρετικό Document Type Definition (DTD) • Ορίζει την γραμματική του κειμένου <?xml version=“1.0”?> <!DOCTYPE name [markupdeclarations]> <name>…</name> root element
DTD • Document Type Definition(DTD): αναπόσπαστο μέρος της XML • Προτάθηκε σαν μια γραμματική για τα XML έγγραφα • Σε κάποιο βαθμό μπορεί να θεωρηθεί σαν σχήμα για δεδομένα μορφοποιημένα σε XML • Ενα DTD που περιγράφει δυαδικά δένδρα: <!ELEMENT node (leaf | (node, node))> <!ELEMENT leaf (#PCDATA)> • Τα DTDs μοιάζουν να ορίζουν τύπους δεδομένων <!DOCTYPE db [ <!ELEMENT db (person*)> <!ELEMENT person (name,age,email)> <!ELEMENT name (#PCDATA)> ...]>
Δήλωση attributes στο DTD • Σύνδεση των attributes με τα elements στα οποία εμφανίζονται <product> <name language=“French” department=“Music”>trompette</name> <price currency=“Euro”> 420.12 </price> </product> <!ATTLIST name language CDATA #REQUIRED department CDATA #IMPLIED> <!ATTLIST price currency CDATA #IMPLIED> • Ορισμός των attributes • #REQUIRED υποχρεωτικό, #IMPLIED προαιρετικό • Τύπος CDATA = string • Τύποι ID, IDREF, IDREFS
Well-formed και valid • Well-formed XML έγγραφα • Τα tags πρέπει να είναι σωστά εμφωλιασμένα • Τα attributes ενός element πρέπει να είναι μοναδικά • Valid XML έγγραφο • Είναι well-formed • Εχει κάποιο DTD • Συμμορφώνεται με αυτό το DTD • Περιορισμοί του DTD σαν σχήμα για δεδομένα XML • Δεν υπάρχουν ατομικοί τύποι (πχ. integer) • Δεν υπάρχουν περιορισμοί διαστήματος (πχ. 0-140) • Ο τύπος ενος element είναι global (πχ. ίδιο name και σε person και σε course;) • Δεν προσδιορίζει τον τυπο των IDREFs
XML και DTDΥποστηρικτικές τεχνολογίεςΓλώσσες ερωτήσεων
XML Namespaces • Πρόβλημα: ο τύπος των element είναι global • Το ίδιο έγγραφο πρέπει να μπορεί να χρησιμοποιηθεί από πολλά προγράμματα που καταλαβαίνουν άλλαmarkups • Συγκρούσεις στην ονοματολογία; • Λύση: XML Namespaces = συλλογές ονομάτων <?xml version="1.0" encoding="ISO-8859-15"?> <html> <body> <p>Welcome to my HealthResource</p> </body> <body> <height>6ft</height> <weight>155 lbs</weight> </body> </html>
XML Namespaces • Πρόβλημα: ο τύπος των element είναι global • Το ίδιο έγγραφο πρέπει να μπορεί να χρησιμοποιηθεί από πολλά προγράμματα που καταλαβαίνουν άλλαmarkups • Συγκρούσεις στην ονοματολογία; • Λύση: XML Namespaces = συλλογές ονομάτων <?xml version="1.0" encoding="ISO-8859-15"?> <html> <body> <p>Welcome to my HealthResource</p> </body> <body> <height>6ft</height> <weight>155 lbs</weight> </body> </html> <?xml version="1.0" encoding="ISO-8859-15"?> <html:html xmlns:html='http://www.w3.org/TR/xhtml1/'>> <html:body> <html:p>Welcome to my HealthResource</html:p> </html:body> <health:body xmlns:health='http://www.example.org/health'> <health:height>6ft</health:height> <heatlh:weight>155 lbs</health:weight> </health:body> </html:html>
XML Schema • Αντιμετωπίζει τις ανεπάρκειες του DTD • Ορίζει αυστηρότερα σύνθετους τύπους, με βασικούς τύπους και περιορισμούς • Εκφράζεται και το ίδιο σε ΧΜL • Ενα απόσπασμα: <xsd:complexType name=“PurchaseOrderType”> <xsd:sequence> <xsd:element name=“shipTo” type=“USAddress”/> <xsd:element name=“billTo” type=“xsd:string”/> <xsd:element name=“comments” minOccurs=“0”/> <xsd:element name=“items” type=“Items”/> </xsd:sequence> <xsd:attribute name=“orderDate” type=“xsd:date”/> </xsd:complexType>
XSL • Αποτελείται από τρια ξεχωριστα τμήματα • XSL Formating Objects • Ορίζει το format παρουσίασης ενός εγγράφου XML • XPath: XML Path Language • Επιλέγει τμήματα ενός εγγράφου XML • Απλοποιημένη μορφή, επιστρέφει τα βιβλία σε ένα XML (πίσω): database/biblio/book(ονόματα XML tags) • Επιστρέφει τους πρώτους συγγραφείς των βιβλίων: root()/descendant::book/child::author[position()=first()] • XSLT: XSL Transformation language • Μετατρέπει ένα έγγραφο XML σε κάποιο άλλο έγγραφο
XSLT: παράδειγμα • Μετατρέπει το XML σε έναν HTML κατάλογο των τίτλων των βιβλίων <database id=“db”> <biblio> <book id=“n1”> <author>Roux</author> <author>Combalusier</author> <date>1976</date> <title>Database Systems</title> </book> <book id=“n2”> <author>Smith</author> <date>1999</date> <title>Database Systems</title> </book> <paper>...</paper> </biblio> </database> <xsl:template match=“/”> <html> <head> <title>Book Titles</title> </head> <body> <h1>Book Titles</h1> <xsl:for-each select=“database/biblio/book”> <xsl:value-of select=“title”/> <br></br> </xsl:for-each> </body> </html> </xsl:template>
XML και DTDΥποστηρικτικές τεχνολογίεςΓλώσσες ερωτήσεων
Γλώσσα XQuery • XQuery: γλώσσα επεξεργασίας XML αρχείων • W3C: www.w3c.org • Είναι συναρτησιακή γλώσσα: βασίζεται σε εκφράσεις που επιστρέφουν τιμές. • Χρησιμοποιεί το XML μοντέλο δεδομένων. • Οι εκφράσεις (expressions) XQuery επιστρέφουν μια (διατεταγμένη) σειρά από κόμβους ή τιμές. • Σημαντικό κομμάτι της XQuery είναι οι εκφράσεις μονοπατιών (path expressions). • Τα παραδείγματα που θα ακολουθήσουν βασίζονται στην αναφορά D. Chamberlin, XQuery: an XML Query Language. IBM Systems Journal, 41(4), 2002.
XML Μοντέλο Δεδομένων <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items>
XML Μοντέλο Δεδομένων <?xml version = "1.0"?> <bids> <bid> <itemno> 4</itemno> <bidder> George </bidder> <bid-amount> 150 </bid-amount> <bid-date> 21/5/2005 </bid-date> </bid> <bid> ... </bid> </bids>
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) /items • Βρες το root element items (“/”).
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) /items/item • Βρες όλα τα elements itemπου είναι παιδιά (‘/’) του root element items (“/”).
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //item • Βρες όλα τα elements item (‘//’: απόγονος).
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //item/seller • Βρες όλα τα elements seller που είναι παιδιά του item (‘//’: απόγονος).
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //item/* • Βρες όλα τα elements που είναι παιδιά του item.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) /item/* • Βρες όλα τα elements που είναι παιδιά του root element item (NULL!).
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //* • Βρες όλα τα elements.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) /*/*/seller • Βρες όλα τα elements sellerπου έχουν 2 προγόνους.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) /items/item[2] • Βρες το 2ο itemπαιδί του element items.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //item[@status] • Βρες όλα τα item elements που έχουν attribute status.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //item[@status=‘new’] • Βρες όλα τα item elements που έχουν attribute status με τιμή ‘new’.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //item[reserve-price>=100] • Βρες όλα τα item elements που έχουν παιδί το reserve-price element και το οποίο έχει value > 100.
<?xml version = "1.0"?> <items> <item status=“old”> <itemno> 3 </itemno> <seller> Theo </seller> <description> toy </description> <reserve-price> 100 </reserve-price> <end-date> 20/5/2005 </end-date> </item> <item status=“new”> ... </item> </items> Εκφράσεις Μονοπατιών • document(“items.xml”) //items/item[seller=Theo]/description • Βρες όλα τα description elements πουέχουν αδέρφια element item (παιδιά του items) τα οποία έχουν παιδί element seller με τιμή Theo (branching XPATH).
Κατασκευαστές • Οι εκφράσεις μονοπατιών έχουν ένα σημαντικό μειονέκτημα: επιστρέφουν κόμβους. • Θα θέλαμε να υπάρχει δυνατότητα κατασκευής καινούριων element, value, καθορισμού των σχέσεων μεταξύ elements (δηλαδή το αποτέλεσμα να μην είναι μεμονωμένοι κόμβοι, αλλά δέντρο κομμάτι του μοντέλου XML), κ.λ.π. • Για το λόγο αυτό η XQuery παρέχει κατασκευαστές (constructors): • {έκφραση XQuery} • η έκφραση αποτιμάται και η {...} αντικαθίστανται από το αποτέλεσμα.
Κατασκευαστές • Παραδείγματα κατασκευαστών: <highbid> {$b/@status,$b/itemno,$b/bid-amount} </highbid> <highbid status ''{$s}'‘> <itemno>{$i}</itemno> <bid-amount> {max($bids[itemno $i]/bid-amount)} </bid-amount> </highbid>
Iterators (For) • Παράδειγμα For iterator: FOR $m in (2, 3), $n in (5, 10) RETURN <fact> {$m} times {$n} is{$m * $n} </fact> • Αποτέλεσμα <fact>2 times 5 is 10</fact> <fact>2 times 10is 20</fact> <fact>3 times 5 is 15</fact> <fact>3 times 10is 30</fact>
Iterators (For), Δέσιμο Μεταβλητών • Παράδειγμα For iterator με δέσιμο (binding) μεταβλητών: FOR $i in (1 to 3) LET $j := (1 to $i) • Αποτέλεσμα $i = 1, $j = 1 $i = 2, $j = (1, 2) $i = 3, $j = (1, 2, 3) • Το δέσιμο μεταβλητών σε For και Let δίνει την δυνατότητα στην XQuery να διασχίζει το μοντέλο δεδομένων XML και να ψάχνει για πολλαπλά ταιριάσματα.
FLoWeRs! • F: FOR • L: LET • W: WHERE • R: RETURN • FLWR (προφέρεται flower) expressions
Παράδειγμα FLOWER 1 (lily) • Βρες αντικείμενα στα οποία έχουν δοθεί δύο προσφορές. • Ερώτηση: FOR $i in document(''items.xml'')/*/item … … RETURN $i bind
Παράδειγμα FLOWER 1 (lily) • Βρες αντικείμενα στα οποία έχουν δοθεί δύο προσφορές. • Ερώτηση: FOR $i in document(''items.xml'')/*/item LET $b := document(''bids.xml'')/*/bid[itemno = $i/itemno] … RETURN $i bind
Παράδειγμα FLOWER 1 (lily) • Βρες αντικείμενα στα οποία έχουν δοθεί δύο προσφορές. • Ερώτηση: FOR $i in document(''items.xml'')/*/item LET $b := document(''bids.xml'')/*/bid[itemno = $i/itemno] WHERE count ($b) =2 RETURN $i bind
Παράδειγμα FLOWER 1 (lily) <?xml version = "1.0"?> <bids> <bid> <itemno> 1</itemno> <bidder> George </bidder> ... </bid> <bid> <itemno> 1 </itemno> <bidder> Theo </bidder> ... </bid> <bid> <itemno> 2 </itemno> <bidder> George </bidder> ... </bid> </bids> <?xml version = "1.0"?> <items> <item status=“old”> <itemno> 1 </itemno> .... </item> <item status=“old”> <itemno> 2 </itemno> .... </item> <item status=“old”> <itemno> 3 </itemno> .... </item>
Παράδειγμα FLOWER 2 (dahlia) • Για κάθε αντικείμενο στο οποίο έχουν δοθεί παραπάνω από δέκα προσφορές, φτιάξε ένα element popular-item που να περιέχει τον κωδικό του αντικειμένου, την περιγραφή και τον αριθμό των προσφορών.