Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

ΕΡΓΑΣΤΗΡΙΟ Ηλεκτρονικού Εμπορίου Ε-Επιχειρείν

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "ΕΡΓΑΣΤΗΡΙΟ Ηλεκτρονικού Εμπορίου Ε-Επιχειρείν"— Μεταγράφημα παρουσίασης:

1 ΕΡΓΑΣΤΗΡΙΟ Ηλεκτρονικού Εμπορίου Ε-Επιχειρείν
ΕΡΓΑΣΤΗΡΙΟ Ηλεκτρονικού Εμπορίου Ε-Επιχειρείν Java APIs για Web Services: ΧΜL και JSP Δρ. Χρήστος Κ. Γεωργιάδης

2 Java API for XML Processing (JAXP)
Επεξεργασία XML δεδομένων με χρήση εφαρμογών κωδικοποιημένων στη γλώσσα Java Τα τρέχοντα APIs για πρόσβαση σε έγγραφα XML, είτε σειριακά είτε με δυνατότητα τυχαίας προσπέλασης είναι αντίστοιχα το SAX και το DOM. Τα βασικά JAXP APIs ορίζονται στο πακέτο (package) javax.xml.parsers SAX (Simple API for XML Parsing) Είναι στην πραγματικότητα ένα προϊόν συνεργασίας της λίστα ηλεκτρονικής αλληλογραφίας XML-DEV, παρά ένα προϊόν από τη W3C. Αλλά διαθέτει «τελικά» χαρακτηριστικά όπως προβλέπει η σύσταση (recommendation) της W3C. Αναλύει τα δεδομένα ως ρεύμα συμβάντων (stream of events) και κάνει επεξεργασία στοιχείο-προς-στοιχείο. Δρ. Χρήστος Κ. Γεωργιάδης

3 SAX (απλή διεπαφή προγραμματισμού εφαρμογών ανάλυσης XML)
Θεωρούμε αυτό το πρότυπο ως το πρωτόκολλο «σειριακής προσπέλασης» για την XML, Π.χ., αυτός μπορεί να είναι ο γρήγορος-για-εκτέλεση μηχανισμός που θα χρησιμοποιούμε για να διαβάσουμε και να γράψουμε τα δεδομένα XML σε έναν διακομιστή (server). Καλείται επίσης πρωτόκολλο οδηγημένο από γεγονότα (event-driven), επειδή η τεχνική είναι να καταχωρηθεί ο χειριστής (handler) μας με έναν αναλυτή (parser) SAX, και μετά ο αναλυτής καλεί τις μεθόδους επανάκλησής μας όποτε βλέπει μια νέα ετικέτα XML (ή αντιμετωπίζει ένα σφάλμα, ή θέλει να μας πει οτιδήποτε άλλο). Απαραίτητο για εφαρμογές server-side και εφαρμογές υψηλής επίδοσης. Κοινά στοιχεία (π.χ. error handling) και χρησιμότητα (μετατροπή data σε XML) ακόμη και για εφαρμογές του άλλου JAXP API, του DOM Δρ. Χρήστος Κ. Γεωργιάδης

4 Δρ. Χρήστος Κ. Γεωργιάδης - 2003
Τα SAX packages Ο αναλυτής SAX ορίζεται από τα ακόλουθα πακέτα: javax.xml.parsers Προσδιορίζει τη κλάση SAXParserFactory Είναι vendor-neutral factory class, που αρχικά «δείχνει» σε υλοποίηση XML της Sun Επιστρέφει τον SAXParser Καθορίζει επίσης κλάσεις εξαιρέσεων (exception classes) για αναφορά λαθών. org.xml.sax Προσδιορίζει τα κύρια SAX interfaces. Το προσδιοριστικό org.xml στο sax package οφείλεται στην ομάδα που προσδιόρισε το SAX API. Δρ. Χρήστος Κ. Γεωργιάδης

5 Δρ. Χρήστος Κ. Γεωργιάδης - 2003
Τα SAX packages ΙΙ org.xml.sax.ext Προσδιορίζει SAX extensions που χρησιμοποιούνται όταν απαιτείται πιο εξεζητημένη επεξεργασία SAX, π.χ. για επεξεργασία εγγράφου DTD ή για ανάγνωση λεπτομερούς σύνταξης ενός αρχείου org.xml.sax.helpers Περιέχει κλάσεις βοήθειας, που διευκολύνουν τη χρήση SAX, π.χ. με το να ορίζεται default handler με κενές (null) μεθόδους για όλα τα interfaces, έτσι ώστε να χρειάζεται να υπερβεί (override) κάποιος, μόνο αυτά που πραγματικά θέλει να υλοποιήσει Δρ. Χρήστος Κ. Γεωργιάδης

6 Δρ. Χρήστος Κ. Γεωργιάδης - 2003
SAX APIs 1. Για να αρχίσει η επεξεργασία, ένα instance της κλάσης SAXParserFactory χρησιμοποιείται για τη παραγωγή ενός instance του parser. 2. O parser συσκευάζει ένα αντικείμενο SAXReader. 3. Όταν η μέθοδος parse του parser καλείται, ο SAXReader επικαλείται μια από τις πολλές μεθόδους callback (επανάκλησης) που έχει υλοποιήσει η εφαρμογή. 4. Αυτές οι μέθοδοι ορίζονται από τα interfaces: ContentHandler, ErrorHandler, DTDHandler, και EntityResolver. Δρ. Χρήστος Κ. Γεωργιάδης

7 Δρ. Χρήστος Κ. Γεωργιάδης - 2003
Τα κύρια SAX APIs SAXParser To SAXParser interface ορίζει διάφορα είδη μεθόδων parse(). Συνήθως, πρέπει να αποσταλεί μια πηγή δεδομένων XML και ένα αντικείμενο DefaultHandler στον parser, ο οποίος επεξεργάζεται τα XML και καλεί τις κατάλληλες μεθόδους στο αντικείμενο χειρισμού (handler) SAXReader Ο SAXParser συσκευάζει έναν SAXReader. Συνήθως δεν ασχολούμαστε μαζί του, αλλά κάθε τόσο χρειάζεται να το «διαμορφώσουμε», χρησιμοποιώντας τη μέθοδο getXMLReader() του SAXParser. Ο SAXReader είναι αυτός που μεταφέρει τη συνομιλία με τους SAX event handlers που ορίζουμε. DefaultHandler Υλοποιεί τα ContentHandler, ErrorHandler, DTDHandler, και EntityResolver interfaces (με κενές μεθόδους), έτσι ώστε να υπερβαίνουμε μόνο όσες χρειάζεται Δρ. Χρήστος Κ. Γεωργιάδης

8 Δρ. Χρήστος Κ. Γεωργιάδης - 2003
Μια τυπική εφαρμογή υλοποιεί τις περισσότερες από τις μεθόδους των ακόλουθων SAX APIs: ContentHandler Όταν μια ετικέτα XML αναγνωρίζεται, καλούνται μέθοδοι όπως οι startDocument, endDocument, startElement, και endElement. Αυτό το interface επίσης ορίζει τις μεθόδους characters και processingInstruction, που καλούνται όταν ο parser εντοπίζει το κείμενο σε ένα στοιχείο XML ή μια inline εντολή επεξεργασίας αντίστοιχα. ErrorHandler Οι μέθοδοι error, fatalError, και warning καλούνται ως απάντηση στα διάφορα λάθη parsing. Ο default handler λαθών ρίχνει μια εξαίρεση (exception) για τα μοιραία (fatal) λάθη και αγνοεί άλλα λάθη (ακόμη και λάθη εγκυρότητας). Αυτός είναι ένας λόγος που χρειάζεται να γνωρίζουμε τον SAX parser, έστω και εάν χρησιμοποιούμε DOM. Ορισμένες φορές η εφαρμογή είναι ικανή να ξεπεράσει ένα λάθος εγκυρότητας. Άλλες φορές θα χρειαστεί να παράγει ένα exception. Για να είμαστε σίγουροι για το σωστό χειρισμό, πρέπει να τροφοδοτήσουμε τον parser με τον δικό μας χειριστή λαθών. Δρ. Χρήστος Κ. Γεωργιάδης

9 Δρ. Χρήστος Κ. Γεωργιάδης - 2003
Παράδειγμα: Echo01.java Λίστα με import … Επεξεργασία παραμέτρου γραμμής εντολής με απόκτηση του ονόματος του αρχείου XML για παρουσίαση και ετοιμασία του ρεύματος εξόδου. public static void main(String argv[]) { if (argv.length != 1) { System.err.println("Usage: cmd filename"); System.exit(1); } try { // Set up output stream out = new OutputStreamWriter(System.out, "UTF8"); catch (Throwable t) { t.printStackTrace(); System.exit(0); static private Writer out; Δρ. Χρήστος Κ. Γεωργιάδης

10 Echo01.java: Ετοιμασία του parser
// Use an instance of ourselves as the SAX event handler DefaultHandler handler = new Echo01(); // Use the default (non-validating) parser SAXParserFactory factory = SAXParserFactory.newInstance(); try... // Parse the input SAXParser saxParser = factory.newSAXParser(); saxParser.parse( new File(argv[0]), handler ); Δρ. Χρήστος Κ. Γεωργιάδης

11 Echo01.java: Εμφάνιση εξόδου
Οι μέθοδοι του ContentHandler υποστηρίζουν SAXExceptions αλλά όχι IOExceptions, τα οποία μπορούν να εμφανιστούν κατά τη διαδικασία του γραψίματος – εμφάνισης εξόδου (writing the output). Έτσι έχει νόημα να γίνεται η έξοδος με μια μέθοδο, την emit(), που φροντίζει τις λεπτομέρειες χειρισμού των exceptions. private void emit(String s) throws SAXException { try { out.write(s); out.flush(); } catch (IOException e) { throw new SAXException("I/O error", e); } Δρ. Χρήστος Κ. Γεωργιάδης

12 Echo01.java: Χαρακτήρας τέλους γραμμής
private void nl() throws SAXException { String lineEnd = System.getProperty("line.separator"); try { out.write(lineEnd); } catch (IOException e) { throw new SAXException("I/O error", e); } Δρ. Χρήστος Κ. Γεωργιάδης

13 Χειρισμός γεγονότων περιεχομένου (content events, ContentHandler)
Γεγονότα Εγγράφου (start-document και end-document) public void startDocument() throws SAXException { emit("<?xml version='1.0' encoding='UTF-8'?>"); nl(); } public void endDocument() try { out.flush(); } catch (IOException e) { throw new SAXException("I/O error", e); Δρ. Χρήστος Κ. Γεωργιάδης

14 Γεγονότα Στοιχείου (start-element και end-element)
public void endElement(String namespaceURI, String sName, // simple name String qName // qualified name ) throws SAXException { String eName = sName; // element name if ("".equals(eName)) eName = qName; // not namespaceAware emit("</"+eName+">"); } public void startElement(String namespaceURI, String sName, // simple name String qName, // qualified name Attributes attrs) throws SAXException { String eName = sName; // element name if ("".equals(eName)) eName = qName; // not namespaceAware emit("<"+eName); if (attrs != null) { for (int i = 0; i < attrs.getLength(); i++) { String aName = attrs.getLocalName(i); // Attr name if ("".equals(aName)) aName = attrs.getQName(i); emit(" "); emit(aName+"=\""+attrs.getValue(i)+"\""); } emit(">"); Δρ. Χρήστος Κ. Γεωργιάδης

15 Δρ. Χρήστος Κ. Γεωργιάδης - 2003
Γεγονότα Χαρακτήρα Χρήση buffer StringBuffer textBuffer; public void characters(char buf[], int offset, int len) throws SAXException { String s = new String(buf, offset, len); if (textBuffer == null) { textBuffer = new StringBuffer(s); } else { textBuffer.append(s); } Δρ. Χρήστος Κ. Γεωργιάδης

16 Δρ. Χρήστος Κ. Γεωργιάδης - 2003
echoText() private void echoText() throws SAXException { if (textBuffer == null) return; String s = ""+textBuffer emit(s); textBuffer = null; } Δρ. Χρήστος Κ. Γεωργιάδης

17 Δρ. Χρήστος Κ. Γεωργιάδης - 2003
Compile & Run Echo01.java Αντιγραφή του endorsed directory… Έλεγχος του output Περισσότερες λεπτομέρειες στο parsing: Echo02.java … Echo10.java Δρ. Χρήστος Κ. Γεωργιάδης


Κατέβασμα ppt "ΕΡΓΑΣΤΗΡΙΟ Ηλεκτρονικού Εμπορίου Ε-Επιχειρείν"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google