Προγραμματισμός

Η χαρτογράφηση Java-XML έγινε εύκολη με το JAXB 2.0

Το Java Architecture for XML Binding παρέχει έναν ισχυρό και πρακτικό τρόπο εργασίας με περιεχόμενο XML από εφαρμογές Java. Το JAXB 2.0 που κυκλοφόρησε πρόσφατα προσφέρει πολλές νέες δυνατότητες, συμπεριλαμβανομένης της πλήρους υποστήριξης όλων των δυνατοτήτων σχήματος XML, σημαντικά λιγότερων κλάσεων που δημιουργούνται, κλάσεων που δημιουργούνται που είναι ευκολότερο να χειριστούν και ενός πιο ευέλικτου μηχανισμού επικύρωσης.

Για να κατανοήσουμε τον τρόπο επεξεργασίας εγγράφων XML στην Java με JAXB 2.0, πρέπει να εξετάσουμε τα δύο κύρια στοιχεία του JAXB:

  • Ο μεταγλωττιστής δέσμευσης, ο οποίος δεσμεύει ένα δεδομένο σχήμα XML σε ένα σύνολο παραγόμενων κλάσεων Java
  • Το δεσμευτικό πλαίσιο χρόνου εκτέλεσης, το οποίο παρέχει λειτουργίες unmarshalling, marshalling και validation

Ο μεταγλωττιστής δέσμευσης JAXB (ή xbj) σας επιτρέπει να δημιουργήσετε τάξεις Java από ένα δεδομένο σχήμα XML. Ο μεταγλωττιστής δέσμευσης JAXB μετατρέπει ένα σχήμα XML σε μια συλλογή τάξεων Java που ταιριάζουν με τη δομή που περιγράφεται στο σχήμα XML. Αυτές οι τάξεις σχολιάζονται με ειδικούς σχολιασμούς JAXB, οι οποίοι παρέχουν στο πλαίσιο εκτέλεσης τις αντιστοιχίσεις που χρειάζεται για την επεξεργασία των αντίστοιχων εγγράφων XML.

Το δεσμευτικό πλαίσιο χρόνου εκτέλεσης παρέχει έναν αποτελεσματικό και εύκολο στη χρήση μηχανισμό για την αποσυμπίεση (ή την ανάγνωση) και τη διαλογή (ή τη σύνταξη) εγγράφων XML. Σας επιτρέπει να μετατρέψετε ένα έγγραφο XML σε μια ιεραρχία αντικειμένων Java (unmarshalling) ή, αντίστροφα, να μετατρέψετε μια ιεραρχία αντικειμένων Java σε μορφή XML (marshalling). Ο όρος επιμελητής παραδοσιακά αναφέρεται στη διάθεση στρατευμάτων με κάποιο κατάλληλο τρόπο. Στη δικτύωση, αναφέρεται στην τοποθέτηση στοιχείων δεδομένων σε ένα buffer πριν από την αποστολή τους μέσω ενός καναλιού επικοινωνίας.

Σε συνδυασμό, αυτά τα δύο συστατικά παράγουν μια τεχνολογία που επιτρέπει στους προγραμματιστές Java να χειρίζονται εύκολα δεδομένα XML με τη μορφή αντικειμένων Java, χωρίς να χρειάζεται να γνωρίζουν τις λεπτομέρειες του Simple API for XML Processing (SAX) ή του Document Object Model (DOM) ή ακόμα και τις λεπτές λεπτομέρειες του σχήματος XML.

Προϋποθέσεις JAXB

Για να ξεκινήσετε με το JAXB 2.0 χρειάζεστε:

  • Java Platform, Standard Edition 5: Το JAXB 2.0 βασίζεται σε μεγάλο βαθμό στις δυνατότητες του Java SE 5, όπως σχολιασμοί και γενικά
  • Μια εφαρμογή του JAXB 2.0

Αυτό το άρθρο γράφτηκε χρησιμοποιώντας τον υποψήφιο έκδοσης υλοποίησης αναφοράς GlassFish JAXB.

Δημιουργήστε τάξεις Java χρησιμοποιώντας τον μεταγλωττιστή JAXB

Ο μεταγλωττιστής JAXB δεσμεύει ένα σχήμα XML σε ένα σύνολο κλάσεων Java. Ένα σχήμα XML είναι ένα έγγραφο XML που περιγράφει, με ακρίβεια, τα στοιχεία και τα χαρακτηριστικά που επιτρέπονται σε έναν συγκεκριμένο τύπο εγγράφου XML. Σε αυτό το παράδειγμα, χρησιμοποιούμε ένα σύστημα κρατήσεων εκπαιδευτικών μαθημάτων που μπορεί να δεχτεί παραγγελίες σε μορφή XML. Μια τυπική παραγγελία μοιάζει με αυτό:

    10 Coyote Avenue, Αριζόνα, ΗΠΑ 

Το αντίστοιχο σχήμα XML περιγράφει τον τρόπο κράτησης του εκπαιδευτικού μαθήματος και περιέχει λεπτομέρειες για το πρόγραμμα που έχει κλείσει, τους εγγεγραμμένους μαθητές, την εταιρεία που πραγματοποιεί την κράτηση και ούτω καθεξής. Μια περιγραφή σχήματος XML είναι εξαιρετικά αυστηρή και μπορεί να περιλαμβάνει λεπτομέρειες όπως ο αριθμός των στοιχείων που επιτρέπονται σε μια λίστα αντικειμένων (καρδινιλότητα), προαιρετικά και υποχρεωτικά χαρακτηριστικά και άλλα. Το σχήμα για τις κρατήσεις εκπαιδευτικών μαθημάτων (καλείται course-booking.xsd) εμφανίζεται εδώ:

Το εργαλείο γραμμής εντολών xjc εκτελεί τον μεταγλωττιστή JAXB. Για να εκτελέσετε τον μεταγλωττιστή JAXB ενάντια στο σχήμα μας, εκτελούμε την ακόλουθη εντολή:

 $ xjc course-booking.xsd -p nz.co.equinox.training.domain.booking -d src / δημιουργήθηκε

Αυτό θα δημιουργήσει ένα σύνολο τάξεων Java με σχολιασμούς JAXB 2.0. Μερικές από τις πιο χρήσιμες επιλογές περιγράφονται εδώ:

  • -ρε : Τοποθετήστε τα αρχεία που δημιουργήθηκαν σε αυτόν τον κατάλογο.
  • : Τοποθετήστε τα δημιουργημένα αρχεία σε αυτό το πακέτο.
  • -ην: Μην εκτελείτε αυστηρή επικύρωση του σχήματος εισόδου.
  • -httpproxy : Χρησιμοποιήστε αυτό εάν είστε πίσω από έναν πληρεξούσιο. Παίρνει τη μορφή [user [: password] @] proxyHost [: proxyPort].
  • -κατάπαθο : Καθορίστε το classpath, εάν είναι απαραίτητο.
  • -μόνο για ανάγνωση: Δημιουργεί αρχεία πηγαίου κώδικα μόνο για ανάγνωση, εάν το λειτουργικό σας σύστημα υποστηρίζει αυτό.

Υπάρχει επίσης ένα ισοδύναμο μυρμήγκι καθήκον, το οποίο καθιστά αρκετά εύκολο να ενσωματωθεί σε μια διαδικασία κατασκευής που βασίζεται σε Ant ή Maven.

Η λίστα των παραγόμενων τάξεων εμφανίζεται εδώ:

 CompanyType.java ContactType.java CourseBooking.java ObjectFactory.java StudentType.java

Οι χρήστες προηγούμενων εκδόσεων του JAXB ενδέχεται να παρατηρήσουν ότι αυτό είναι ένα απλό σύνολο σχολιασμένων και πλήρως τεκμηριωμένων κλάσεων Java, παρά το πιο δυσκίνητο σύνολο διεπαφών και υλοποιήσεων προηγούμενων εκδόσεων. Έτσι, έχουμε λιγότερα παραγόμενα μαθήματα και ελαφρύτερο και πιο κομψό κώδικα. Και, όπως θα δείτε στην επόμενη ενότητα, ο χειρισμός αυτών των τάξεων είναι εύκολος.

Κατάργηση προσθήκης ενός εγγράφου XML

Το Unmarshalling είναι η διαδικασία μετατροπής ενός εγγράφου XML σε ένα αντίστοιχο σύνολο αντικειμένων Java. Η αποσυμφόρηση στο JAXB 2.0 είναι εύκολη. Πρώτα, δημιουργείτε ένα JAXBCπεριεχόμενο αντικείμενο περιβάλλοντος. Το αντικείμενο περιβάλλοντος είναι το σημείο εκκίνησης για τις εργασίες μαρκαρίσματος, αποσυμπλοκής και επικύρωσης. Εδώ καθορίζετε το πακέτο Java που περιέχει τις τάξεις που έχουν αντιστοιχιστεί με JAXB:

 JAXBContext jaxbContext = JAXBContext.newInstance ("nz.co.equinox.training.domain.booking");

Για να καταργήσετε την καταχώριση ενός εγγράφου XML, δημιουργείτε ένα Ανεπαρκές από το πλαίσιο, όπως φαίνεται εδώ:

 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller ();

ο unmarshaller μπορεί να επεξεργαστεί δεδομένα XML από μια μεγάλη ποικιλία πηγών δεδομένων: αρχεία, ροές εισόδου, διευθύνσεις URL, αντικείμενα DOM, αναλυτές SAX και άλλα. Εδώ παρέχουμε ένα απλό Αρχείο αντικείμενο που δείχνει το έγγραφο XML μας. ο unmarshaller επιστρέφει ένα πληκτρολογημένο Στοιχείο JAXB, από το οποίο μπορούμε να αποκτήσουμε το αμετάβλητο αντικείμενο μας χρησιμοποιώντας το getValue () μέθοδος:

JAXBElement bookingElement = (JAXBElement) unmarshaller.unmarshal (νέο αρχείο ("src / test / resources / xml / booking.xml"));

Κράτηση μαθήματος = bookingElement.getValue ();

Επικύρωση εγγράφου

Η επικύρωση εγγράφου είναι η διαδικασία διασφάλισης ότι το έγγραφό σας XML αντιστοιχεί στον ορισμό που δίνεται στο αντίστοιχο σχήμα XML. Είναι μια σημαντική πτυχή κάθε έργου που περιλαμβάνει ανταλλαγές XML, ειδικά εάν το XML προέρχεται από άλλα συστήματα. Η επικύρωση εγγράφων στο JAXB 2.0 είναι ευκολότερη και πιο ευέλικτη από ό, τι σε προηγούμενες εκδόσεις. Μπορείτε απλά να επισυνάψετε ένα ValidatonEventHandler στο unmarshaller προτού καταργήσετε την ανάθεση του εγγράφου XML, όπως φαίνεται εδώ:

 unmarshaller.setEventHandler (νέο BookingValidationEventHandler ());

Ένας χειριστής συμβάντων επικύρωσης εφαρμόζει το ValidationEventHandler διεπαφή και το handleEvent () μέθοδο, όπως φαίνεται εδώ:

δημόσια τάξη BookingValidationEventHandler εφαρμόζει το ValidationEventHandler {

δημόσια boolean handleEvent (ValidationEvent ve) {

εάν (ve.getSeverity () == ValidationEvent.FATAL_ERROR || ve .getSeverity () == ValidationEvent.ERROR) {ValidationEventLocator locator = ve.getLocator (); // Εκτύπωση μηνύματος από το συμβάν valdation System.out.println ("Μη έγκυρο έγγραφο κράτησης:" + locator.getURL ()); System.out.println ("Σφάλμα:" + ve.getMessage ()); // Γραμμή εξόδου και αριθμός στήλης System.out.println ("Σφάλμα στη στήλη" + locator.getColumnNumber () + ", γραμμή" + locator.getLineNumber ()); } επιστροφή αληθινή; }}

Εδώ απλώς εκτυπώνουμε λεπτομέρειες για το σφάλμα, αλλά σε μια πραγματική εφαρμογή, μπορεί να είναι κατάλληλη κάποια λιγότερο ασήμαντη μεταχείριση. Σε ορισμένες περιπτώσεις, ίσως ακόμη και να θεωρήσετε ότι το σφάλμα επικύρωσης δεν είναι ένα πρόγραμμα διακοπής εκπομπών και ότι δεν θα εμποδίσει την επεξεργασία. Επιστρέφοντας αλήθεια, λέτε στο unmarshaller για να συνεχίσετε τη διαδικασία unmarshalling: false θα τερματίσει τη διαδικασία με την κατάλληλη εξαίρεση.

Εγγράφοντας ένα έγγραφο

Το Marshalling περιλαμβάνει τη μετατροπή των τάξεων Java σε μορφή XML. Στο JAXB 2.0, η δημιουργία και ο χειρισμός αυτών των τάξεων Java είναι απλή. Στις περισσότερες περιπτώσεις, μπορείτε απλώς να τα αντιμετωπίζετε σαν συνηθισμένα μαθήματα Java, όπως φαίνεται εδώ:

 Κράτηση μαθήματος = νέα κράτηση μαθήματος (); booking.setCourseReference ("UML-101"); booking.setTotalPrice (νέο BigDecimal (10000)); ...

Σημειώστε ότι μπορείτε ακόμα να χρησιμοποιήσετε το Εργοστάσιο αντικειμένων τάξη παρόμοια με τον τρόπο που το χρησιμοποιήσατε στο JAXB 1.0, όπως φαίνεται στην ακόλουθη λίστα. Ωστόσο, σε αντίθεση με το JAXB 1.0, δεν υπάρχουν διεπαφές ή κλάσεις υλοποίησης: όλα τα αντικείμενα τομέα είναι σχολιασμένα στοιχεία JavaBeans.

 ObjectFactory factory = νέο ObjectFactory (); Κράτηση μαθήματος = factory.createCourseBooking (); ...

Αν και οι περισσότεροι τύποι δεδομένων XML αντιστοιχίζονται απευθείας σε κανονικές τάξεις Java, απαιτείται κάποια ειδική μεταχείριση για ορισμένους τύπους δεδομένων, όπως οι ημερομηνίες. Σε αυτές τις περιπτώσεις, πρέπει να χρησιμοποιήσετε το Τύπος δεδομένων, όπως φαίνεται εδώ:

 DatatypeFactory τύποι δεδομένων = DatatypeFactory.newInstance (); booking.setCourseDate (datatypes.newXMLGregorianCalendarDate (2006,06,15,0));

Μόλις αρχικοποιηθεί το αντικείμενο του τομέα σας, χρησιμοποιήστε το πλαίσιο JAXB για να δημιουργήσετε ένα Μάρσαλλερ αντικείμενο και δακτυλογραφημένο Στοιχείο JAXB. Δημιουργία του Μάρσαλλερ είναι απλό:

 Marshaller marshaller = jaxbContext.createMarshaller ();

Στη συνέχεια, δημιουργείτε ένα Στοιχείο JAXB αντικείμενο που ενσωματώνει το αντικείμενο τομέα σας. Ο δακτυλογραφημένος Στοιχείο JAXB αντιστοιχεί στο ριζικό στοιχείο complexType του εγγράφου XML σας. Στη συνέχεια, χρησιμοποιήστε το δημιουργημένο Εργοστάσιο αντικειμένων τάξη ως εξής:

 JAXBElement bookingElement = (νέο ObjectFactory ()). CreateBooking (κράτηση);

Σε αυτό το παράδειγμα, ορίζουμε μια ιδιότητα έτσι ώστε η έξοδος να μορφοποιηθεί για ανθρώπινη χρήση και στη συνέχεια να γράψουμε σε τυπική έξοδο:

 marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal (bookingElement, System.out);

Ένα πλήρες δείγμα κώδικα εμφανίζεται εδώ:

JAXBContext jaxbContext = JAXBContext.newInstance ("nz.co.equinox.training.domain.booking");

Κράτηση CourseBooking = νέο CourseBooking (); booking.setCourseReference ("UML-101"); booking.setTotalPrice (νέο BigDecimal (10000)); booking.setInvoiceReference ("123456"); DatatypeFactory τύποι δεδομένων = DatatypeFactory.newInstance (); booking.setCourseDate (datatypes.newXMLGregorianCalendarDate (2006,06,15,0)); booking.setTotalPrice (νέο BigDecimal (10000)); booking.setInvoiceReference ("123456"); booking.getStudent (). add (νέο StudentType ()); booking.getStudent (). get (0) .setFirstName ("John"); booking.getStudent (). get (0) .setSurname ("Smith"); booking.setCompany (νέος τύπος εταιρείας ()); booking.getCompany (). setName ("Clients inc."); booking.getCompany (). setContact (νέος τύπος επαφής ()); booking.getCompany (). getContact (). setName ("Paul"); booking.getCompany (). getContact (). setEmail ("[email protected]"); booking.getCompany (). getContact (). setTelephone ("12345678"); booking.getCompany (). setAddress ("10 πελάτης δρόμου");

// Marshal to System.out Marshaller marshaller = jaxbContext.createMarshaller (); JAXBElement bookingElement = (νέο ObjectFactory ()). CreateBooking (κράτηση); marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

marshaller.marshal (bookingElement, System.out);

Η εκτέλεση αυτού του κώδικα θα δημιουργήσει κάτι τέτοιο: