ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΤΜΗΜΑ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΣΗΜΑΣΙΟΛΟΓΙΚΟΣ ΙΣΤΟΣ - XML Εργαστήριο 3 Στουγιάννου Ελευθερία estoug@unipi.gr
Περιεχόμενα Τρίτου Εργαστηριακού Μαθήματος Ορίζοντας διαλέκτους DTDs (συνέχεια) DTD Ασκήσεις
DTD Element Παράδειγμα_1 Παράδειγμα ενός XML document και το αντίστοιχο DTD
DTD Element Παράδειγμα_2 Παράδειγμα ενός XML document και το αντίστοιχο DTD
DTD για Email Element Παράδειγμα_3 (1/2) Να γραφεί ένα DTD για ένα «email» element. Το head element περιλαμβάνει (με αυτή τη σειρά): ένα from element τουλάχιστον ένα to element μηδέν ή περισσότερα cc elements ένα subject element Στα from, to και cc elements: το name attribute δεν είναι απαραίτητο το address attribute απαιτείται πάντα Το body element περιλαμβάνει: ένα text element που πιθανώς ακολουθείται από έναν αριθμό attachment elements. Το encoding attribute ενός attachment element πρέπει να έχει είτε την τιμή mime είτε την τιμή binhex mime είναι η default τιμή. Το file attribute απαιτείται πάντα.
DTD για Email Element Παράδειγμα_3 (2/2) email.dtd (ανοίξτε ένα notepad και αποθηκεύστε το αρχείο με την κατάληξη.dtd)
DTD- Οντότητες (Entities) Οι οντότητες δηλώνονται μέσα στο DTD. <!ENTITY όνομα-οντότητας τιμή-οντότητας > Εξωτερικές Οντότητες <!ENTITY όνομα SYSTEM URI> Παράδειγμα 1: <!ENTITY όνομα PUBLIC FPI URI> DTD: <!ENTITY COLOUR White > <!ENTITY PRICE 300 Euros > XML Αρχείο: <mobile_phone> &COLOUR; &PRICE; </mobile_phone> Για ιδιωτική χρήση, όπου URI= model.ent Για κοινή χρήση, όπου FPI= //starpowder// Custom Entity Version 1.0//EN Παράδειγμα 2: <!ENTITY Όνομα Παπαδοπούλου > <!ENTITY Διευθύντρια Το γραφείο της κα &Όνομα; είναι στον 1ο όροφο. > Παράδειγμα 3: Οι αναφορές στις οντότητες ΔΕΝ μπορεί να είναι κυκλικές. <!ENTITY Όνομα Παπαδοπούλου &Διευθύντρια; > <!ENTITY Διευθύντρια Το γραφείο της κα &Όνομα; είναι στον 1ο όροφο. > Παράδειγμα 4: ΔΕΝ μπορεί να εισαχθεί κείμενο που προορίζεται να χρησιμοποιηθεί μόνο σε περιεχόμενο DTD και όχι στο περιεχόμενο του XML εγγράφου. <!ENTITY Tags (Name, Date, Orders) > <!ELEMENT Customer &Tags;>
DTD Παράδειγμα_4 (1/3) Έχουμε την παρακάτω δενδρική δομή. Να γραφεί το XML έγγραφο που αντιστοιχεί σε αυτήν, και κατόπιν να γραφεί το DTD.
DTD Παράδειγμα_4 (2/3) XML έγγραφο που αντιστοιχεί στην παραπάνω δενδρική δομή.
DTD Παράδειγμα_4 (3/3) Το DTD που αντιστοιχεί στην παραπάνω δενδρική δομή και στο παραπάνω XML έγγραφο.
DTD Παράδειγμα_5 (1/6) Η φόρμα του δελτίου δανεισμού βιβλίων από τη βιβλιοθήκη του πανεπιστημίου έχει την εξής μορφή: Η δενδρική αναπαράσταση του παραπάνω δελτίου και τα XML έγγραφα (με χρήση elements και με χρήση elements/attributes) φαίνονται στις επόμενες διαφάνειες. Να γραφούν τα DTD που αντιστοιχούν σε αυτό το δελτίο, με χρήση elements, και με χρήση elements/attributes.
DTD Παράδειγμα_5 (2/6)
DTD Παράδειγμα_5 (3/6) XML έγγραφο που αναπαριστά το δενδρικό διάγραμμα Α ΤΡΟΠΟΣ: με χρήση elements <?xml version="1.0" encoding="utf-8"?> <Δελτίο> <Βιβλίο> <Ταξινομικός_Αριθμός>Χ2054</Ταξινομικός_Αριθμός> <Συγγραφέας>John Doe</Συγγραφέας> <Συγγραφέας>Mary Doe</Συγγραφέας> <Τίτλος>XML</Τίτλος> <Ημερομηνία>2011</Ημερομηνία> </Βιβλίο> <Χρήστης> <Κωδικός_Χρήστη>ΜΤΕ0915</Κωδικός_Χρήστη> </Χρήστης> </Δελτίο>
DTD Παράδειγμα_5 (4/6) XML έγγραφο που αναπαριστά το δενδρικό διάγραμμα Β ΤΡΟΠΟΣ: με χρήση attributes (Κωδικός_χρήστη και Ταξινομικός_Αριθμός ως attributes στα elements Χρήστης και Βιβλίο). <?xml version="1.0" encoding="utf-8"?> <Δελτίο> <Βιβλίο Ταξινομικός_Αριθμός= X2054 > <Συγγραφέας>John Doe</Συγγραφέας> <Συγγραφέας>Mary Doe</Συγγραφέας> <Τίτλος>XML</Τίτλος> <Ημερομηνία>2011</Ημερομηνία> </Βιβλίο> <Χρήστης Κωδικός_Χρήστη= MTE0915 /> </Δελτίο>
DTD Παράδειγμα_5 (5/6) DTD που αναπαριστά το δενδρικό διάγραμμα Α ΤΡΟΠΟΣ: το XML document δημιουργήθηκε με χρήση elements. <!ELEMENT Δελτίο (Βιβλίο, Χρήστης)> <!ELEMENT Βιβλίο (Ταξινομικός_Αριθμός, Συγγραφέας+, Τίτλος, Ημερομηνία)> <!ELEMENT Χρήστης (Κωδικός_Χρήστη)> <!ELEMENT Ταξινομικός_Αριθμός (#PCDATA)> <!ELEMENT Συγγραφέας (#PCDATA)> <!ELEMENT Τίτλος (#PCDATA)> <!ELEMENT Ημερομηνία (#PCDATA)> <!ELEMENT Κωδικός_Χρήστη (#PCDATA)>
DTD Παράδειγμα_5 (6/6) DTD που αναπαριστά το δενδρικό διάγραμμα Β ΤΡΟΠΟΣ: το XML document δημιουργήθηκε με χρήση attributes (Κωδικός_χρήστη και Ταξινομικός_Αριθμός ως attributes στα elements Χρήστης και Βιβλίο). <!ELEMENT Δελτίο (Βιβλίο, Χρήστης)> <!ELEMENT Βιβλίο (Συγγραφέας+, Τίτλος, Ημερομηνία)> <!ATTLIST Βιβλίο Ταξινομικός_Αριθμός ID #REQUIRED> <!ELEMENT Συγγραφέας (#PCDATA)> <!ELEMENT Τίτλος (#PCDATA)> <!ELEMENT Ημερομηνία (#PCDATA)> <!ELEMENT Χρήστης EMPTY> <!ATTLIST Χρήστης Κωδικός_Χρήστη ID #REQUIRED >
DTD Άσκηση_1 (1/3) Δίνεται το DTD: <!DOCTYPE universities [ <!ELEMENT universities (university*)> <!ELEMENT university (name, location, faculty+)> <!ELEMENT faculty (staff*)> <!ELEMENT name (#PCDATA)> <!ELEMENT location (#PCDATA)> <!ELEMENT staff (#PCDATA)> ]> Ελέγξτε αν τα ακόλουθα XML έγγραφα είναι έγκυρα (valid).
DTD Άσκηση_1 (2/3) <universities> <university> <name>the Hong Kong University</name> <location>pokfulam, Hong Kong</location> </university> </universities> <universities> </universities> <universities> <university> <name>the Hong Kong University</name> <location>pokfulam, Hong Kong</location> <faculty> Engineering <staff>alan Wong</staff> <staff>peter & Sun</staff> </faculty> <faculty /> </university> </universities> Ξαναγράψτε το faculty element declaration, ώστε να κάνεις το XML της παραπάνω γραμμής valid.
DTD Άσκηση_1 (3/3) <universities> <university> <name>the Hong Kong University</name> <location>pokfulam, Hong Kong</location> </university> </universities> <universities> </universities> <universities> <university> <name>the Hong Kong University</name> <location>pokfulam, Hong Kong</location> <faculty> Engineering <staff>alan Wong</staff> <staff>peter & Sun</staff> </faculty> <faculty /> </university> </universities> Ξαναγράψτε το faculty element declaration, ώστε να κάνεις το XML της παραπάνω γραμμής valid. ΛΥΣΕΙΣ <universities> <university> <name>the Hong Kong University</name> <location>pokfulam, Hong Kong</location> <faculty /> </university> </universities> Valid <universities> <university> <name>the Hong Kong University</name> <location>pokfulam, Hong Kong</location> <faculty> <! Αφαιρούμε το Engineering --> <staff>alan Wong</staff> <staff>peter & Sun</staff> </faculty> <faculty /> </university> </universities> <!DOCTYPE universities [ <!ELEMENT universities (university*)> <!ELEMENT university (name, location, faculty+)> <!ELEMENT faculty (#PCDATA staff)*> <!ELEMENT name (#PCDATA)> <!ELEMENT location (#PCDATA)> <!ELEMENT staff (#PCDATA)> ]>
DTD Άσκηση_2 (1/2) (Α) Γράψτε τη δήλωση του attribute για να δημιουργήσετε ένα προαιρετικό text string attribute με τίτλο "Title" για το element "Book". (Β) Το "Play" element έχει ένα required attribute με όνομα "Type", το οποίο μπορεί να έχει μία από 4 πιθανές τιμές: Romance, Tragedy, History, και Comedy. Γράψτε την κατάλληλη δήλωση για το attribute. (Γ) Το Book element έχει ένα required ID attribute με όνομα "ISBN". Γράψτε την κατάλληλη δήλωση για το attribute. (Δ) Το Author element έχει ένα optional attribute με όνομα "written", το οποίο αναφέρεται στους ISBN αριθμούς των βιβλίων που έχει γράψει ο συγγραφέας. Εάν το ISBN είναι ένα ID attribute για κάποιο άλλο element του εγγράφου, τι δήλωση θα χρησιμοποιήσεις για το "written" attribute? (Ε) Το Book element έχει ένα optional attribute με όνομα "InStock" που μπορεί να έχει την τιμή "yes" ή "no". Η default τιμή είναι "yes". Γράψτε μια δήλωση για το "InStock" attribute.
DTD Άσκηση_2 Λύση (2/2) (Α) Γράψτε τη δήλωση του attribute για να δημιουργήσετε ένα προαιρετικό text string attribute με τίτλο "Title" για το element "Book". <!ATTLIST Book Title CDATA #IMPLIED> (Β) Το "Play" element έχει ένα required attribute με όνομα "Type", το οποίο μπορεί να έχει μία από 4 πιθανέτιμές: Romance, Tragedy, History, και Comedy.Γράψτε την κατάλληλη δήλωση για το attribute. <!ATTLIST Play Type (Romance Tragedy History Comedy) #REQUIRED> (Γ) Το Book element έχει ένα required ID attribute με όνομα "ISBN". Γράψτε την κατάλληλη δήλωση για το attribute. <!ATTLIST Book ISBN ID #REQUIRED> (Δ) Το Author element έχει ένα optional attribute με όνομα "written", το οποίο αναφέρεται στους ISBN αριθμούς των βιβλίων που έχει γράψει ο συγγραφέας. Εάν το ISBN είναι ένα ID attribute για κάποιο άλλο element του εγγράφου, τι δήλωση θα χρησιμοποιήσεις για το "written" attribute? <!ATTLIST Author written IDREF #IMPLIED> (Ε) Το Book element έχει ένα optional attribute με όνομα "InStock" που μπορεί να έχει την τιμή "yes" ή "no". Η default τιμή είναι "yes". Γράψτε μια δήλωση για το "InStock" attribute. <!ATTLIST Book InStock (yes no) "yes">
DTD Άσκηση_3 (1/2) Γράψτε ένα valid XML έγγραφο που θα προσπελάσει το ακόλουθο DTD: <!DOCTYPE TVSCHEDULE [ <!ELEMENT TVSCHEDULE (CHANNEL+)> <!ELEMENT CHANNEL (BANNER,DAY+)> <!ELEMENT BANNER (#PCDATA)> <!ELEMENT DAY (DATE,(HOLIDAY PROGRAMSLOT+)+)> <!ELEMENT HOLIDAY (#PCDATA)> <!ELEMENT DATE (#PCDATA)> <!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)> <!ELEMENT TIME (#PCDATA)> <!ELEMENT TITLE (#PCDATA)> <!ELEMENT DESCRIPTION (#PCDATA)> <!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED> <!ATTLIST CHANNEL CHAN CDATA #REQUIRED> <!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED> <!ATTLIST TITLE RATING CDATA #IMPLIED> <!ATTLIST TITLE LANGUAGE CDATA #IMPLIED> ]>
DTD Άσκηση_3 Λύση (2/2) Το valid XML έγγραφο που θα προσπελάσει το DTD της προηγούμενης διαφάνειας: <TVSCHEDULE NAME="tvb"> <CHANNEL CHAN="1"> <BANNER>TVB pearl</banner> <DAY> <DATE>2009-10-1</DATE> <HOLIDAY>National Day</HOLIDAY> </DAY> </CHANNEL> </TVSCHEDULE>
DTD Άσκηση_4 (1/2) Γράψτε ένα internal DTD που να κάνει validate το ακόλουθο XML έγγραφο: <newspaper> <article author="kelvin" date="2009-9-9"> <headline>apple's next big thing is Steve Jobs</headline> <body>on September 9, Steve Jobs returned to the public eye...</body> <notes>nice</notes> <notes>good</notes> </article> <article author="tim" edition="1"> <headline>headline B. Each can only has one lead</headline> <lead>this is a lead. Each article can only has one lead</lead> <body>this is the body of the news &publisher; ©right;</body> </article> </newspaper>
DTD Άσκηση_4 Λύση (2/2) Το internal DTD που κάνει validate το XML έγγραφο της προηγούμενης διαφάνειας: <!DOCTYPE newspaper [ ]> <!ELEMENT newspaper (article+)> <!ELEMENT article (headline, lead?, body, notes*)> <!ELEMENT headline (#PCDATA)> <!ELEMENT lead (#PCDATA)> <!ELEMENT body (#PCDATA)> <!ELEMENT notes (#PCDATA)> <!ATTLIST article author CDATA #REQUIRED> <!ATTLIST article date CDATA #IMPLIED> <!ATTLIST article edition CDATA #IMPLIED> <!ENTITY publisher "Vervet Logic Press"> <!ENTITY copyright "copyright 1998 Vervet Logic Press">
DTD Άσκηση_5 (1/3) Δίνεται το παρακάτω DTD: <?xml version="1.0"?> <!DOCTYPE publisher [ <!ELEMENT publisher (name, book+, author*)> <!ELEMENT book (name, (publish re_print), right)> <!ELEMENT name (#PCDATA)> <!ELEMENT publish (#PCDATA)> <!ELEMENT re_print (#PCDATA)> <!ELEMENT right (#PCDATA)> <!ELEMENT author (DOB?)> <!ELEMENT DOB (#PCDATA)> <!ATTLIST book number ID #REQUIRED> <!ATTLIST author name NMTOKEN #REQUIRED> <!ATTLIST author written IDREFS #IMPLIED> <!ATTLIST publish format CDATA #FIXED "yyyy-mm-dd"> <!ATTLIST re_print format CDATA "yyyy-mm-dd"> <!ATTLIST DOB format (yyyy-mm-dd dd-mm-yyyy yy-mm-dd) "yyyy-mm-dd"> ]> Ελέγξτε κάθε γραμμή του XML εγγράφου. Αν είναι σωστή βάζετε, αλλιώς γράφετε το σωστό.
DTD Άσκηση_5 (2/3) XML Έγγραφο <publisher> <Name>Mango Publishing Ltd.</Name> <book number="b231"> <name>beginner XML</name> <publish format="yyyy-dd-mm">2008-1-1</publish> <right>copyright 2008 Mango Publishing Ltd.</right> </book> <book number="b232"> <name>advanced <XML></XML></name> <publish>2005-10-2</publish> <re_print>2009-1-1</re_print> <right>copyright 2009 Mango Publishing Ltd.</right> </book> <book number="b232"> <name>practical XML</name> <publish>09-1-1</publish> <right>copyright 2009 Mango Publishing Ltd.</right> </book> <author name="emma"> <DOB format="dd-mm">5-10</dob> <remark>i love swimming</remark> </author> <author written="b231 B232"> <DOB>1970-8-2</Dob>/book> </author> <author name="james Wong" written="a231" /> </publisher>
DTD Άσκηση_5 Λύση (3/3) XML Έγγραφο <publisher> <Name>Mango Publishing Ltd.</Name> <book number="b231"> <name>beginner XML</name> <publish format="yyyy-dd-mm">2008-1-1</publish> <right>copyright 2008 Mango Publishing Ltd.</right> </book> <book number="b232"> <name>advanced <XML></XML></name> <publish>2005-10-2</publish> <re_print>2009-1-1</re_print> <right>copyright 2009 Mango Publishing Ltd.</right> </book> <book number="b232"> <name>practical XML</name> <publish>09-1-1</publish> <right>copyright 2009 Mango Publishing Ltd.</right> </book> <author name="emma"> <DOB format="dd-mm">5-10</dob> <remark>i love swimming</remark> </author> <author written="b231 B232"> <DOB>1970-8-2</Dob>/book> </author> <author name="james Wong" written="a231" /> </publisher> <name>...</name> yyyy-mm-dd <XML></XML> Remove this line (EITHER-OR ) B233 yyyy-mm-dd Remove this line (there is not any remark element) name="john (REQUIRED name) <DOB>1970-8-2</DOB> Line 26: name="james" written="b231"
DTD Άσκηση_6 (1/2) Δίνεται το παρακάτω XML αρχείο: Να δοθεί το DTD, bank.dtd, σύμφωνα με τις παρακάτω απαιτήσεις: Υπάρχουν 2 τύποι λογαριασμών: savings accounts και checking accounts. To account id είναι μοναδικό για το στοιχείο accounts. To customer id είναι μοναδικό για το στοιχείο customers. To c_id αναφέρεται στο στοιχείο customers και το ac_id αναφέρεται στο στοιχείο accounts. Το account balance πρέπει να είναι μεγαλύτερο από -5000.
DTD Άσκηση_6 Λύση (2/2) To DTD είναι το παρακάτω:
DTD Άσκηση_7 (1/2) Δίνεται το παρακάτω XML αρχείο. Να δοθεί το DTD.
DTD Άσκηση_7 Λύση (2/2) To DTD φαίνεται παρακάτω: DTD:
DTD Άσκηση_8 (1/2) Δίνεται το παρακάτω DTD. Να δοθεί ένα παράδειγμα ΧΜL αρχείου.
DTD Άσκηση_8 Λύση (2/2) Ένα παράδειγμα XML αρχείου φαίνεται παρακάτω: XML Αρχείο:
Ερωτήσεις??