8. Προγραμματισμός με XML

Σχετικά έγγραφα
Συντακτική ανάλυση εγγράφων XML µε Xerces

XML related standards

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Διαδίκτυο και Εφαρμογές 2η Άσκηση Μετασχηματισμοί XML και XSL. Γιαννέλος Γιάννης ΑΜ: Μαρινέλλης Γιώργος ΑΜ:

Γλωσσική Τεχνολογία. HTML/XML Processing HTTP Services

5. Επερώτηση XML Εγγράφων: Εισαγωγή στη Γλώσσα XQuery

2.1 Αντικειµενοστρεφής προγραµµατισµός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Κλάσεις και Αντικείµενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Βασίλης Χριστοφίδης Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 21 Σεπτεµβρίου 2012

Λογισµικό (Software SW) Γλώσσες

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

DOM. Διδάσκοντες: Π. Αγγελάτος, Δ. Ζήνδρος Επιμέλεια διαφανειών: Π. Αγγελάτος Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

SGML (Standard Generalized Markup Language) HTML (HyperText Markup Language) XML (extensible Markup Language)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπερφόρτωση Αντικείμενα σαν ορίσματα

4. Συνδεδεμένες Λίστες

Αντικειμενοστρεφής Προγραμματισμός

Αντικειµενοστρεφής Προγραµµατισµός

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Ειδικά Θέματα Προγραμματισμού

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

2.1. Εντολές Σχόλια Τύποι Δεδομένων

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

3. Επερώτηση XML Εγγράφων: Η Γλώσσα XPath

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Αντικειμενοστρεφής Προγραμματισμός

Διδάσκων: Παναγιώτης Ανδρέου

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Συλλογές και Επαναλήπτες. Συλλογές - Collections

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

Δομές Δεδομένων - Εργαστήριο 2. Λίστες

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

Δομές Δεδομένων & Αλγόριθμοι

6. Εξαιρέσεις στη γλώσσα Java

3 Αλληλεπίδραση Αντικειμένων

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( )

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Αρχεία Ένα αρχείο αποτελείται από μία σειρά ομοειδών δεδομένων που ονομάζονται λογικές εγγραφές (logical record)

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

Τι είναι η Spring. Η Spring είναι ένα ελεύθερο (open source) περιβάλλον εργασίας για εφαρμογές Java. Μπορεί να περιγραφεί ως:

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ASPA: A translator from ASP to PHP

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

Ειδικά Θέματα Προγραμματισμού

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Πανεπιστηµιο Πειραιως Σχολη Τεχνολογιων Πληροφορικης και Επικοινωνιων Τµηµα Ψηφιακων Συστηµατων οµές εδοµένων η Εργασία

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors Υπερφόρτωση Αντικείμενα ως παράμετροι

άσκηση Hide UI Elements 7.2 Try and Catch

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

HY-252 Αντικειμενοστραφής Προγραμματισμός. Χειμερινό Εξάμηνο 2012 Διδάσκων: Χριστοφίδης Βασίλης. Ημερομηνία Παράδοσης: 16/11/2012

ιαδικτυακές Εφαρµογές

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Υλοποίηση Δυαδικού Σωρού σε γλώσσα Java. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

Γλώσσα Προγραμματισμού C++ Εισαγωγή - Μια πρώτη ματιά

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εξαιρέσεις

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 133: ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΕΡΓΑΣΤΗΡΙΟ 3 Javadoc Tutorial

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Transcript:

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων 8. Προγραμματισμός με XML ιαχείριση εδομένων στον Παγκόσμιο Ιστό Χρήστος ουλκερίδης Τμήμα Ψηφιακών Συστημάτων ευτέρα 21 Νοεμβρίου 2016

Document Object Model (DOM)

Τι Είναι το DOM; (1) Το Document Object Model (DOM) είναι ένα Application Programming Interface (API) για HTML και XML έγγραφα Καθορίζει τη λογική δομή των εγγράφων, καθώς και τον τρόπο πρόσβασης και διαχείρισης ενός εγγράφου Αποτελεί W3C standard Έχει σχεδιαστεί ώστε να μπορεί να χρησιμοποιηθεί από οποιαδήποτε γλώσσα προγραμματισμού Οι προγραμματιστές χρησιμοποιώντας το DOM μπορούν να ημιουργούν έγγραφα Πλοηγούνται στη δομή των εγγράφων Προσθέτουν, τροποποιούν και διαγράφουν elements και περιεχόμενο Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 3

Τι Είναι το DOM; (2) To Document Object Model (DOM) παρέχει Ένα προκαθορισμένο σύνολο αντικειμένων για την αναπαράσταση HTML και XML εγγράφων Ένα καθορισμένο μοντέλο για τον τρόπο με τον οποίο αυτά τα αντικείμενα μπορούν να συνδυαστούν Μια καλά ορισμένη διεπαφή (interface) για πρόσβαση και διαχείριση των αντικειμένων Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 4

Ιστορικό 1998: DOM Level-1 Παρείχε ένα πλήρες μοντέλο για HTML ή XML έγγραφα και δυνατότητες τροποποίησης τέτοιων εγγράφων Περιορισμένη λειτουργικότητα στον Internet Explorer 5.0 2000: DOM Level-2 Function getelementbyid() Event model Υποστήριξη XML namespaces και CSS 2004: DOM Level-3 Υποστήριξη XPath Keyboard event handling ιεπαφή για serialization εγγράφων σε XML Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 5

Εφαρμογές JavaScript Ένας browser δε χρειάζεται να χρησιμοποιήσει το DOM για να εμφανίζει HTML σελίδες Όμως, scripts σε JavaScript απαιτούν το DOM για να διαχειριστούν ή να τροποποιήσουν μια ιστοσελίδα δυναμικά Το DOM είναι ο τρόπος με τον οποίο η JavaScript «βλέπει» την ιστοσελίδα στην οποία περιέχεται Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 6

Μοντέλο Δεδομένων Τα XML δεδομένα αναπαριστώνται με μια δομή δεδομένων που επιτρέπει πλοήγηση - στη μνήμη του υπολογιστή Λόγω του nesting των XML elements, χρησιμοποιείται μια δενδρική δομή δεδομένων ιατρέχοντας το δένδρο παρέχεται πρόσβαση σε στοιχεία του XML εγγράφου Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 7

Απλό Παράδειγμα (1) <TABLE> <TBODY> <TR> </TR> <TR> </TR> </TBODY> </TABLE> <TD>Shady Grove</TD> <TD>Aeolian</TD> <TD>Over the River, Charlie</TD> <TD>Dorian</TD> Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 8

Απλό Παράδειγμα (2) Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 9

Έμφαση στο Object Model (1) Το DOM είναι object model, υπό την έννοια του αντικειμενοστρεφούς μοντέλου Τα έγγραφα μοντελοποιούνται με χρήση αντικειμένων Το μοντέλο περιέχει όχι μόνο τη δομή, αλλά και τη συμπεριφορά του εγγράφου και των αντικειμένων από τα οποία απαρτίζεται Άρα οι κόμβοι στο προηγούμενο σχήμα δεν αναπαριστούν μια δομή δεδομένων, αλλά αντικείμενα Τα οποία έχουν αναγνωριστικά και συναρτήσεις Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 10

Έμφαση στο Object Model (2) To DOM μπορεί να αναπαριστά οποιοδήποτε XML έγγραφο (ανεξαρτήτως της δομής του), αρκεί να ακολουθεί το specification της XML To DOM δεν είναι πρόγραμμα Απλά παρέχει μια διεπαφή (interface) την οποία μπορεί να υλοποιήσει ο καθένας με διαφορετικό τρόπο Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 11

Πώς Λειτουργεί το DOM; To DOM υλοποιείται ως ένα ενδιάμεσο επίπεδο μεταξύ του XML parser και της εφαρμογής Ο parser διαβάζει τα XML δεδομένα και «περνάει» τα δεδομένα στο DOM Στη συνέχεια, τo DOM χρησιμοποιείται από μια εφαρμογή υψηλότερου επιπέδου Για να φτιάξουμε μια τέτοια εφαρμογή χρειαζόμαστε εγκατεστημένα στον υπολογιστή μας Έναν XML parser Μια υλοποίηση του DOM Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 12

Διάφορες Υλοποιήσεις Xerces Μια βιβλιοθήκη συναρτήσεων για parsing, επικύρωση, διαχείριση, και serialization XML ιαθέσιμη σε Java, C++, Perl MSXML (Microsoft XML Core Services) Εφαρμογές που γράφονται σε JScript, VBScript ή άλλα εργαλεία ανάπτυξης Microsoft μπορούν να διαχειρίζονται XML JAXP (Java API for XML Processing) Ένα Java API για parsing και επικύρωση XML Υποστηρίζει τα εξής parsing interfaces: DOM, SAX, και StAX Υποστηρίζει και XSLT JDOM Open-source Java Document Object Model Συνδυάζει DOM και SAX Υποστηρίζει XPath και XSLT Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 13

DOMString Για την εξασφάλιση ότι όλες οι υλοποιήσεις του DOM λειτουργούν με τον ίδιο τρόπο, έχει καθοριστεί ο τύπος δεδομένων DOMString Μια ακολουθία 16-bit χαρακτήρων που χρησιμοποιείται οποτεδήποτε χρειάζεται ένα string Άρα στο DOM όλα τα string είναι UTF-16 To DOMString χρησιμοποιείται από το specification για να υπάρχει μια κοινή αναφορά Οι υλοποιήσεις δεν είναι υποχρεωμένες να φτιάξουν έναν τέτοιο τύπο δεδομένων Πολλές γλώσσες χρησιμοποιούν εγγενώς αναπαραστάσεις των string με χαρακτήρες16-bits, οπότε μπορούν να χρησιμοποιούν αυτό τον τύπο ως έχει Άλλες (C και C++) χρησιμοποιούν είτε 8-bit ή 16-bit, οπότε εκεί θέλει προσοχή να χρησιμοποιείται πάντα η 16-bit εκδοχή Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 14

Στοιχεία του DOM To DOM αναπαριστά ένα έγγραφο ως ιεραρχία από Node αντικείμενα Κάποια από αυτά μπορούν να έχουν κόμβους παιδιά, ενώ άλλα όχι είτε http://www.w3.org/tr/rec-dom-level-1/level-one-core.html Επίσης, υποστηρίζονται interfaces όπως NodeList: ταξινομημένες λίστες από αντικείμενα Node Π.χ. Για αναπαράσταση των παιδιών ενός κόμβου NamedNodeMap: μη ταξινομημένα σύνολα από αντικείμενα Node Π.χ. Για αναπαράσταση των attributes ενός element Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 15

Παραδείγματα DOM σε JAXP

Java API for XML Processing To JAXP χρησιμοποιείται για την επεξεργασία XML δεδομένων από Java εφαρμογές Υποστηρίζει Το Document Object Model (DOM) To Simple API for XML Parsing (SAX) To Extensible Stylesheet Language Transformations (XSLT) standard Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 17

Document Object Model APIs Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 18

Ένα Απλό Πρόγραμμα με DOM (1) Πρώτα φτιάχνουμε έναν DOM parser, που είναι το αντικείμενο DocumentBuilder Ο parser δημιουργείται όχι καλώντας κάποιον constructor, αλλά καλώντας μια static factory μέθοδο DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newdocumentbuilder(); Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 19

Ένα Απλό Πρόγραμμα με DOM (2) Έστω ότι θέλουμε να διαβάσουμε ένα XML αρχείο hello.xml <?xml version="1.0"?> <message>hello World!</message> Για να διαβάσουμε το αρχείο, προσθέτουμε την ακόλουθη γραμμή Document document = builder.parse("hello.xml"); Το αντικείμενο Document περιέχει ολόκληρο το XML αρχείο με τη μορφή δένδρου Εάν ήθελα να εντοπίσω και να εκτυπώσω τα περιεχόμενα του root element Element root = document.getdocumentelement(); Node textnode = root.getfirstchild(); System.out.println(textNode.getNodeValue()); Το πρόγραμμα αυτό θα εμφάνιζε στην οθόνη: Hello World! Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 20

Ανάγνωση του Δένδρου Η μέθοδος parse διαβάζει ολόκληρο το ΧML έγγραφο και το αναπαριστά με δενδρική μορφή στη μνήμη Εάν το έγγραφο είναι μεγάλο, το parsing μπορεί να χρειαστεί αρκετό χρόνο Εάν είναι επιθυμητό να αλληλεπιδρούμε με το πρόγραμμά μας καθώς γίνεται το parsing, πρέπει ο parser να εκτελεστεί σαν ξεχωριστό thread Στην πράξη, ένα δένδρο μπορεί να χρησιμοποιεί έως και 10 φορές περισσότερη μνήμη από το μέγεθος του αρχικού ΧML εγγράφου Εάν όμως θέλουμε να κάνουμε πολλές πράξεις επεξεργασίας ή ενημέρωσης στο δένδρο, η χρήση του DOM αποτελεί τον κατάλληλο τρόπο ιαφορετικά υπάρχουν και πιο αποδοτικοί τρόποι SAX Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 21

Δομή του DOM Δένδρου Το DOM δένδρο αποτελείται από Node objects To Node είναι ένα interface Ορισμένα σημαντικά sub-interfaces είναι τα Element, Attr, και Text Ένα Element node μπορεί να έχει παιδιά Τα Attr και Text nodes είναι φύλλα του δένδρου Συνεπώς, το DOM δένδρο περιέχει διάφορα Node objects Τα Node objects μπορούν να γίνουν cast σε συγκεκριμένους τύπους εφόσον χρειάζεται Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 22

Διακρίνοντας Τύπους Κόμβων Ένας απλός τρόπος: switch(node.getnodetype()) { case Node.ELEMENT_NODE: Element element = (Element)node;...; break; case Node.TEXT_NODE: Text text = (Text)node;... break; case Node.ATTRIBUTE_NODE: Attr attr = (Attr)node;... break; default:... } Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 23

Λειτουργίες σε Κόμβους Τα αποτελέσματα που επιστρέφουν οι συναρτήσεις getnodename(), getnodevalue(), getnodetype() και getattributes() εξαρτώνται από τον τύπο του κόμβου Element Text Attr getnodename() tag name "#text" name of attribute getnodevalue() null text contents value of attribute getnodetype() ELEMENT_NODE TEXT_NODE ATTRIBUTE_NODE getattributes() NamedNodeMap null null Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 24

Κι Άλλες Λειτουργίες σε Κόμβους Μέθοδοι για πλοήγηση στο δένδρο που επιστρέφουν Node: getparentnode() getfirstchild() getnextsibling() getprevioussibling() getlastchild() Μέθοδοι ελέγχου που επιστρέφουν true/false: hasattributes() haschildnodes() Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 25

Λειτουργίες σε Elements String gettagname() Επιστρέφει το όνομα του tag boolean hasattribute(string name) Επιστρέφει true εάν το Element έχει attribute με το συγκεκριμένο όνομα String getattribute(string name) Επιστρέφει την τιμή του attribute boolean hasattributes() Επιστρέφει true εάν το Element έχει έστω και ένα attribute NamedNodeMap getattributes() Επιστρέφει ένα αντικείμενο NamedNodeMap που περιέχει όλα τα attributes του Element Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 26

Λειτουργίες σε Text Το Text είναι sub-interface του CharacterData και κληρονομεί τις ακόλουθες μεθόδους (μεταξύ άλλων): public String getdata() throws DOMException Επιστρέφει το text περιεχόμενο του συγκεκριμένου Text κόμβου public int getlength() Επιστρέφει το πλήθος των Unicode χαρακτήρων στο text public String substringdata(int offset, int count) throws DOMException Επιστρέφει ένα substring του text περιεχόμενου Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 27

Λειτουργίες σε Attributes String getname() Επιστρέφει το όνομα του attribute Element getownerelement() Επιστρέφει το Element node στο οποίο ανήκει το attribute boolean getspecified() Επιστρέφει true εάν αυτό το attribute είχε πάρει τιμή στο έγγραφο String getvalue() Επιστρέφει την τιμή του attribute σαν String Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 28

Pre-order Διάσχιση του Δένδρου Το DOM αποθηκεύεται στη μνήμη σαν δένδρο Γενικά, τα δένδρα μπορούμε να τα επεξεργαστούμε με έναν από τους ακόλουθους τρόπους pre-order, in-order, post-order Ένας απλός τρόπος είναι η preorder Η γενική ιδέα μιας pre-order διάσχισης είναι: Επίσκεψη της root Επίσκεψη καθενός από τα subtrees με σειρά που εμφανίζονται Πρώτα το αριστερό sub-tree, μετά το δεξιό sub-tree F Β G Α C H D E I F,B,A,C,D,E,G,H,I,J J Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 29

Pre-order Διάσχιση σε Java static void simplepreorderprint(string indent, Node node) { printnode(indent, node); if(node.haschildnodes()) { Node child = node.getfirstchild(); while (child!= null) { simplepreorderprint(indent + " ", child); child = child.getnextsibling(); } } } static void printnode(string indent, Node node) { System.out.print(indent); System.out.print(node.getNodeType() + " "); System.out.print(node.getNodeName() + " "); System.out.print(node.getNodeValue() + " "); System.out.println(node.getAttributes()); } Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 30

Πλεονεκτήματα Μειονεκτήματα του DOM Το DOM φορτώνει ολόκληρο το έγγραφο στη μνήμη και το διατηρεί σαν δενδρική δομή δεδομένων Επιτρέπει τροποποιήσεις σε όλο το περιεχόμενο του εγγράφου με εύκολο τρόπο Επιτρέπει πρόσβαση σε τυχαία σημεία του εγγράφου οποιαδήποτε στιγμή Ανάλογα με το μέγεθος του εγγράφου μπορεί να καταναλώνει πολλή μνήμη και να αργεί Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 31

Simple API for XML (SAX)

Μοντέλο Επεξεργασίας του SAX To SAX είναι ένα δημοφιλές (αλλά ad-hoc) standard για XML parsing Ο parser βλέπει μια ακολουθία από elements σαν ροή (stream) Κάθε φορά που ένα XML element εντοπίζεται, ένα event λαμβάνει χώρα Εκτελείται ένα κομμάτι κώδικα (ο event handler) που συσχετίζεται με τον parser Πρόβλημα ύσκολο να έχουμε μια καθολική εικόνα του εγγράφου Η κατάσταση (state) κατά τη διάρκεια του parsing διατηρείται σε καθολικές μεταβλητές που ενημερώνονται από τους event handlers Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 33

Διαφορές Μεταξύ DOM και SAX Το DOM φορτώνει ολόκληρο το XML έγγραφο στη μνήμη και το αποθηκεύει με δενδρική μορφή Το SAX διαβάζει το έγγραφο και καλεί μεθόδους για να χειριστεί το εκάστοτε element ή κομμάτι text που συναντά Συνέπειες Το DOM επιτρέπει την τυχαία προσπέλαση ( random access ) στο έγγραφο Το SAX επιτρέπει μόνο τη σειριακή προσπέλαση στο έγγραφο Το DOM είναι αργό και έχει υψηλές απαιτήσεις μνήμης, άρα δεν είναι κατάλληλο για μεγάλα έγγραφα Το SAX είναι γρήγορο και δεν απαιτεί πολύ μνήμη Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 34

Parsing με SAX Το SAX χρησιμοποιεί το μοντέλο source-listenerdelegate για το parsing των XML documents Το source είναι τα XML δεδομένα που περιέχουν XML elements Ένας listener γράφεται σε Java, συσχετίζεται με το έγγραφο, και περιμένει να συμβεί κάποιο event Όταν λαμβάνει χώρα ένα event, μια μέθοδος αναλαμβάνει να διαχειριστεί το event (delegated), και εκτελείται ο κώδικας της μεθόδου Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 35

Callbacks Το SAX λειτουργεί με callbacks: Το πρόγραμμα καλεί τον parser Ο parser καλεί μεθόδους που παρέχονται από το πρόγραμμα Πρόγραμμα main(...) Ο SAX parser parse(...) startdocument(...) startelement(...) characters(...) endelement( ) enddocument( ) Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 36

Ένα Απλό SAX Πρόγραμμα Το πρόγραμμα αποτελείται από δύο κλάσεις: Sample (Αυτή η κλάση περιέχει την κύρια μέθοδο) Χρησιμοποιεί ένα factory που κατασκευάζει parsers Φτιάχνει έναν parser από το factory Φτιάχνει ένα Handler object για να χειριστεί τα callbacks από τον parser Ορίζει στον parser σε ποιο handler θα στέλνονται τα callbacks ιαβάζει το XML αρχείο Handler (Αυτή η κλάση περιέχει handlers για τρία είδη από callbacks) startelement callbacks, λαμβάνουν χώρα όταν δει ένα start tag endelement callbacks, λαμβάνουν χώρα όταν δει ένα end tag characters callbacks, λαμβάνουν χώρα όταν δει τα περιεχόμενα ενός element Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 37

Η Κλάση Sample (1) import javax.xml.parsers.*; // for both SAX and DOM import org.xml.sax.*; import org.xml.sax.helpers.*; // For simplicity, we let the operating system handle exceptions // In "real life" this is poor programming practice public class Sample { public static void main(string args[]) throws Exception { // Create a parser factory SAXParserFactory factory = SAXParserFactory.newInstance(); // Tell factory that the parser must understand namespaces factory.setnamespaceaware(true); // Make the parser SAXParser saxparser = factory.newsaxparser(); XMLReader parser = saxparser.getxmlreader(); Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 38

Η Κλάση Sample (2) // Create a handler Handler handler = new Handler(); // Tell the parser to use this handler parser.setcontenthandler(handler); // Finally, read and parse the document parser.parse("hello.xml"); } // end of Sample class Ο parser διαβάζει το αρχείο hello.xml Το αρχείο πρέπει να βρίσκεται Στον ίδιο φάκελο ή Σε κάποιο φάκελο που έχει οριστεί στο classpath Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 39

Η Κλάση Handler (1) public class Handler extends DefaultHandler { Η DefaultHandler είναι μια adapter κλάση που ορίζει κενές μεθόδους οι οποίες θα γίνουν override Ορίζουμε 3 μεθόδους για το χειρισμό (1) start tags, (2) περιεχομένων, και (3) end tags. Κάθε μέθοδος απλά θα εκτυπώνει μια γραμμή Καθεμιά από τις 3 μεθόδους πετάει μια SAXException // SAX calls this when it encounters a start tag public void startelement(string namespaceuri, String localname, String qualifiedname, Attributes attributes) throws SAXException { System.out.println("startElement: " + qualifiedname); } Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 40

Η Κλάση Handler (2) // SAX calls this method to pass in character data public void characters(char ch[ ], int start, int length) throws SAXException { System.out.println("characters: \"" + new String(ch, start, length) + "\""); } // SAX call this method when it encounters an end tag public void endelement(string namespaceuri, String localname, String qualifiedname) throws SAXException { System.out.println( endelement: /" + qualifiedname); } } // End of Handler class Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 41

Αποτελέσματα (1) Ας υποθέσουμε ότι το αρχείο hello.xml περιέχει: <?xml version="1.0"?> <display>hello World!</display> Τότε το output της εκτέλεσης του java Sample θα είναι: startelement: display characters: "Hello World!" endelement: /display Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 42

Αποτελέσματα (2) Εάν το αρχείο hello.xml περιέχει: <?xml version="1.0"?> <display> <i>hello</i> World! </display> Το root element <display> περιέχει ένα εμφωλιασμένο element <i> και whitespace (συμπεριλαμβανομένων newlines) Το αποτέλεσμα εμφανίζεται δεξιά startelement: display characters: "" characters: " " // newline characters: " " startelement: i characters: "Hello" endelement: /i characters: "World!" characters: " " // another newline endelement: /display // empty string // spaces Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 43

Factories Το SAX χρησιμοποιεί ένα parser factory Ένα factory αποτελεί ένα design pattern εναλλακτικό των constructors Τα factories επιτρέπουν στον προγραμματιστή Να αποφασίσει εάν θα φτιάξει ένα νέο αντικείμενο Να αποφασίσει τι είδους αντικείμενο θα φτιάξει class TrustMe { private TrustMe() { } // private constructor } public static TrustMe maketrust() { // factory method if ( /* test of some sort */) return new TrustMe(); } } Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 44

Parser Factories Για να φτιάξουμε ένα SAX parser factory, καλούμε τη static μέθοδο: SAXParserFactory.newInstance() Επιστρέφει ένα αντικείμενο τύπου SAXParserFactory Μπορεί να πετάξει ένα FactoryConfigurationError Στη συνέχεια, ο parser μπορεί να παραμετροποιηθεί: public void setnamespaceaware(boolean awareness) Καλείται με true εάν χρησιμοποιούνται namespaces Το default (εφόσον δεν κληθεί η μέθοδος) είναι false public void setvalidating(boolean validating) Καλείται με true εάν θέλουμε έλεγχο εγκυρότητας με βάση κάποιο DTD Το default (εφόσον δεν κληθεί η μέθοδος) είναι false Ο έλεγχος εγκυρότητας θα επιστρέψει λάθος εάν δεν υπάρχει DTD Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 45

Δημιουργώντας έναν Parser Μόλις φτιαχτεί ένα SAXParserFactory factory, parsers μπορούν να δημιουργηθούν με: SAXParser saxparser = factory.newsaxparser(); XMLReader parser = saxparser.getxmlreader(); Παρατήρηση: ο SAXParser δεν είναι thread-safe Άρα εάν ένας parser θα χρησιμοποιηθεί σε πολλαπλά threads, θα πρέπει να φτιαχτεί ένα ξεχωριστό SAXParser αντικείμενο για κάθε thread Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 46

Δηλώνοντας τους Handlers Μιας και ο SAX parser θα καλέσει τους handlers, πρέπει να παρέχουμε αυτές τις μεθόδους ηλώνουμε στον parser τον handler: Handler handler = new Handler(); parser.setcontenthandler(handler); Τελικά, ο parser καλείται με όρισμα το αρχείο: parser.parse("hello.xml"); Όλα τα υπόλοιπα γίνονται στις μεθόδους του handler Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 47

SAX Handlers Ένας callback handler πρέπει να υλοποιεί 4 interfaces: interface ContentHandler Χειρίζεται βασικά parsing callbacks, π.χ. element starts και ends interface DTDHandler Χειρίζεται μόνο notation και unparsed entity declarations interface EntityResolver Χειρισμός των external entities interface ErrorHandler Πρέπει να υλοποιηθεί, διαφορετικά τα λάθη κατά το parsing θα αγνοούνται Το να υλοποιήσουμε όλα αυτά τα interfaces απαιτεί αρκετό κόπο Είναι ευκολότερο να χρησιμοποιήσουμε μια adapter class Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 48

Κλάση DefaultHandler Η DefaultHandler είναι ένας adapter από το package org.xml.sax.helpers Η DefaultHandler υλοποιεί τις ContentHandler, DTDHandler, EntityResolver, και ErrorHandler Η DefaultHandler παρέχει κενές μεθόδους για κάθε μέθοδο που δηλώνεται σε καθένα από τα interfaces Για να χρησιμοποιηθεί αυτή η κλάση, πρέπει να γίνει extend και να γίνουν override οι μέθοδοι που έχουν νόημα για την εκάστοτε εφαρμογή Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 49

Μέθοδοι της ContentHandler (1) public void startelement(string namespaceuri, String localname, String qualifiedname, Attributes atts) throws SAXException Αυτή η μέθοδος καλείται στην αρχή των elements Όταν το SAX καλεί την startelement, περνάει μια παράμετρο τύπου Attributes Οι ακόλουθες μέθοδοι ανακτούν attributes με βάση name αντί για index: public int getindex(string qualifiedname) public int getindex(string uri, String localname) public String getvalue(string qualifiedname) public String getvalue(string uri, String localname) Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 50

Μέθοδοι της ContentHandler (2) public void endelement(string namespaceuri, String localname, String qualifiedname) throws SAXException Οι παράμετροι της endelement είναι οι ίδιες με εκείνες της startelement, εκτός από την παράμετρο Attributes που παραλείπεται public void characters(char[] ch, int start, int length) throws SAXException Το ch είναι ένα array από χαρακτήρες Τα περιεχόμενα του element είναι length (σε πλήθος) χαρακτήρες, ξεκινώντας από τον ch[start] Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 51

Error Handling Η διαχείριση λαθών (error handling) στο SAX είναι ασυνήθιστη Τα περισσότερα errors αγνοούνται αν δεν καθοριστεί ένας org.xml.sax.errorhandler error handler Errors που αγνοούνται μπορεί να προκαλέσουν μη αναμενόμενη συμπεριφορά Το ErrorHandler interface δηλώνει: public void fatalerror (SAXParseException exception) throws SAXException // XML not well structured public void error (SAXParseException exception) throws SAXException // XML validation error public void warning (SAXParseException exception) throws SAXException // minor problem Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 52

Προβλήματα του SAX To SAX παρέχει μόνο σειριακή προσπέλαση στο έγγραφο To SAX έχει μόνο μια τοπική γνώση του τρέχοντος element υπό επεξεργασία Καθολική γνώση που αφορά το parsing πρέπει να αποθηκεύεται σε καθολικές μεταβλητές Υπάρχει μία μόνο startelement() μέθοδος για όλα τα elements Άρα χρειάζονται πολλά if-then-else για τον έλεγχο ενός συγκεκριμένου element Όταν ένα element συναντιέται, ένα καθολικό flag τίθεται true Όταν ολοκληρωθεί η επεξεργασία του element το καθολικό flag τίθεται false Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 53

Streaming API for XML (StAX)

Τι Είναι το StAX; A streaming Java technology-based, eventdriven, pull-parsing API for reading and writing XML documents Το StAX επιτρέπει τη δημιουργία parsers που Είναι δύο κατευθύνσεων (bi-directional read/write) Είναι γρήγοροι Προγραμματίζονται σχετικά εύκολα εν καταναλώνουν πολλή μνήμη Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 55

Streaming vs. DOM Υπάρχουν δύο τρόποι (μοντέλα) προγραμματισμού για επεξεργασία XML πληροφορίας Streaming Το XML έγγραφο διαβάζεται δυναμικά και σειριακά κομμάτι-κομμάτι Μπορεί να παράγεται έξοδος κατά τη διάρκεια ανάγνωσης Χαμηλή κατανάλωση μνήμης Επειδή ανά πάσα στιγμή είναι διαθέσιμο στη μνήμη μόνο ένα μέρος του XML εγγράφου, προϋποθέτει εκ των προτέρων γνώση των περιεχομένων του XML εγγράφου Document Object Model (DOM) Αναπαράσταση στη μνήμη ολόκληρου του XML εγγράφου Πλήρης ελευθερία στην πρόσβαση οποιουδήποτε στοιχείου του εγγράφου Υψηλή κατανάλωση μνήμης Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 56

Pull Parsing vs. Push Parsing Push style Pull style SAX Parser Your App Your App StAX Parser Push parsing Ο parser στέλνει XML δεδομένα στην εφαρμογή, καθώς συναντά elements στο XML αρχείο Pull parsing Η εφαρμογή καλεί μεθόδους του parser, όταν χρειάζεται να αποκτήσει πρόσβαση σε δεδομένα του XML αρχείου Πλεονεκτήματα pull parsing Η εφαρμογή ελέγχει πλήρως το πρόγραμμα, καλώντας μεθόδους του parser όταν χρειαστεί Μικρότερος και ευκολότερος κώδικας υνατότητα ανάγνωσης πολλαπλών εγγράφων με μιας υνατότητα φιλτραρίσματος (elements που δεν χρειάζονται, αγνοούνται) Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 57

Σύγκριση με άλλα JAXP APIs Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 58

StAX API Το StAX API παρέχει μεθόδους για επαναληπτική (iterative) και βασισμένη σε events (event-based) επεξεργασία XML εγγράφων Τα XML έγγραφα αντιμετωπίζονται σαν μια σειρά από events Καθώς χειριζόμαστε τα events, διατηρείται η κατάσταση για κομμάτια του XML εγγράφου Το StAX API αποτελείται από δύο διακριτά API To Cursor API To Iterator API Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 59

Cursor API Λειτουργεί όπως ένας δρομέας (cursor) που επιτρέπει την πρόσβαση σε ένα XML έγγραφο από την αρχή ως το τέλος του Ο δρομέας «δείχνει» σε ένα αντικείμενο κάθε φορά και κινείται πάντα προς τα εμπρός Υπάρχουν δύο βασικά interfaces XMLStreamReader XMLStreamWriter Το Cursor API μοιάζει αρκετά με το SAX Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 60

XMLStreamReader και XMLStreamWriter Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 61

Iterator API Το Iterator API αναπαριστά ένα stream XML δεδομένων σαν ένα σύνολο διακριτών events Τα events τα λαμβάνει η εφαρμογή (για την ακρίβεια τα ζητάει pull) Τα events παρέχονται από τον parser με τη σειρά που διαβάζεται το XML έγγραφο XMLEvent XMLEventReader XMLEventWriter Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 62

XMLEventReader και XMLEventWriter Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 63

Event types StartDocument StartElement EndElement Characters EntityReference ProcessingInstruction Comment EndDocument DTD Attribute Namespace Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 64

Σύγκριση Cursor με Iterator API Για εφαρμογές με περιορισμένη διαθέσιμη μνήμη (Java ME), το Cursor API παράγει μικρότερο και πιο αποδοτικό κώδικα Εάν αυτό που μας ενδιαφέρει είναι υψηλή απόδοση, το Cursor API είναι πιο αποδοτικό Εάν επιθυμούμε να επεξεργαζόμαστε XML με διασωληνωμένο τρόπο (XML processing pipelines), καλύτερο είναι το Iterator API Εάν θέλουμε να τροποποιήσουμε το event stream, τότε χρησιμοποιούμε το Iterator API Εάν επιθυμούμε η εφαρμογή να δέχεται διαφορετικούς τρόπους επεξεργασίας (pluggable processing of the event stream), επιλέγουμε το Iterator API Εάν δεν έχουμε κάποιο σημαντικό λόγο προτίμησης Χρησιμοποιούμε το Iterator API διότι είναι πιο ευέλικτο και επεκτάσιμο Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 65

Δημιουργία Αντικειμένων Πηγή: http://tutorials.jenkov.com/java-xml/stax.html Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 66

XMLEventReader (1) Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 67

XMLEventReader (2) Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 68

XMLStreamReader (1) Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 69

XMLStreamReader (2) Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 70

XMLEventWriter (1) Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 71

XMLEventWriter (2) Παραγόμενο XML αρχείο Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 72

XMLStreamWriter Παραγόμενο XML αρχείο Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 73

Πηγές Αναφοράς W3C Document Object Model http://www.w3.org/dom/ Java API for XML Processing (JAXP) Tutorial http://docs.oracle.com/javase/tutorial/jaxp/intro/index.html SAX project http://www.saxproject.org/ StAX tutorial http://docs.oracle.com/javase/tutorial/jaxp/stax/index.html Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 74

Δείγματα Κώδικα http://www.java-samples.com/showtutorial.php?tutorialid=152 http://totheriver.com/learn/xml/xmltutorial.html#6 http://www.drdobbs.com/jvm/easy-dom-parsing-in-java/231002580 http://tutorials.jenkov.com/java-xml/dom.html http://tutorials.jenkov.com/java-xml/stax.html Διαχ.Δεδομένων στον ΠΙ, 7ο Εξάμηνο 75