Ohjelmointi

Java-XML-kartoitus on helppoa JAXB 2.0: n avulla

Java Architecture for XML Binding tarjoaa tehokkaan ja käytännöllisen tavan työskennellä XML-sisällön kanssa Java-sovelluksissa. Äskettäin julkaistu JAXB 2.0 tarjoaa monia uusia ominaisuuksia, mukaan lukien kaikkien XML-skeeman ominaisuuksien täyden tuen, huomattavasti vähemmän luotuja luokkia, luotuja luokkia, joita on helpompi käsitellä, ja joustavamman vahvistusmekanismin.

Ymmärtääksemme kuinka XML-asiakirjoja käsitellään Java-järjestelmässä JAXB 2.0: lla, meidän on tarkasteltava kahta JAXB-pääkomponenttia:

  • Sidontakääntäjä, joka sitoo tietyn XML-skeeman luotujen Java-luokkien joukkoon
  • Sitova ajonaikainen kehys, joka tarjoaa purkamis-, järjestely- ja validointitoiminnot

JAXB-sidontakääntäjä (tai xbj) avulla voit luoda Java-luokkia tietystä XML-mallista. JAXB-sidontakääntäjä muuntaa XML-mallin Java-luokkakokoelmaksi, joka vastaa XML-skeemassa kuvattua rakennetta. Nämä luokat on merkitty erityisillä JAXB-merkinnöillä, jotka tarjoavat ajonaikaisen kehyksen vastaavien XML-asiakirjojen käsittelemiseen tarvittavilla kartoituksilla.

Sitova ajonaikainen kehys tarjoaa tehokkaan ja helppokäyttöisen mekanismin XML-asiakirjojen purkamisen (tai lukemisen) ja jakamisen (tai kirjoittamisen) purkamiseksi. Sen avulla voit muuntaa XML-asiakirjan Java-objektien hierarkiaksi (purkaminen) tai päinvastoin muuntaa Java-objektihierarkia XML-muotoon (järjestely). Termi järjestely Perinteisesti viitataan joukkojen hävittämiseen sopivalla tavalla. Verkkoyhteydessä se viittaa datakohteiden sijoittamiseen puskuriin ennen niiden lähettämistä tietoliikennekanavan kautta.

Yhdessä nämä kaksi komponenttia tuottavat tekniikan, jonka avulla Java-kehittäjät voivat helposti muokata XML-tietoja Java-objektien muodossa tarvitsematta tietää yksinkertaisen XML-käsittelyliittymän (SAX) tai asiakirjaobjektimallin (DOM) yksityiskohtia. tai jopa XML-skeeman hienovaraisuudet.

JAXB-edellytykset

JAXB 2.0: n käytön aloittaminen edellyttää:

  • Java Platform, Standard Edition 5: JAXB 2.0 luottaa suuresti Java SE 5: n ominaisuuksiin, kuten huomautuksiin ja yleisiin tietoihin
  • JAXB 2.0: n toteutus

Tämä artikkeli on kirjoitettu GlassFish JAXB -viitteiden käyttöönoton ehdokkaalla.

Luo Java-luokat JAXB-kääntäjän avulla

JAXB-kääntäjä sitoo XML-skeeman Java-luokkaryhmään. XML-skeema on XML-asiakirja, joka kuvaa hyvin tarkasti tietyn tyyppisessä XML-dokumentissa hyväksytyt elementit ja määritteet. Tässä esimerkissä käytämme kurssivarausjärjestelmää, joka voi hyväksyä tilauksia XML-muodossa. Tyypillinen tilaus näyttää tältä:

    10 Coyote Avenue, Arizona, USA 

Vastaava XML-skeema kuvaa, kuinka kurssi varataan, ja sisältää tiedot varatusta kurssista, ilmoittautuneista opiskelijoista, varauksen tekevästä yrityksestä ja niin edelleen. XML-kaavakuvaus on erittäin tarkka ja voi sisältää yksityiskohtia, kuten sallittujen elementtien määrän objektiluettelossa (kardinaalisuus), valinnaisia ​​ja pakollisia määritteitä ja paljon muuta. Kurssivarausten malli (kutsutaan kurssivaraukset.xsd) näkyy tässä:

Komentorivityökalu xjc suorittaa JAXB-kääntäjän. Jos haluat suorittaa JAXB-kääntäjän malliamme vastaan, suoritamme seuraavan komennon:

 $ xjc course-booking.xsd -p nz.co.equinox.training.domain.booking -d src / luotu

Tämä luo joukon Java-luokkia, jotka on merkitty JAXB 2.0 -merkinnöillä. Joitakin hyödyllisempiä vaihtoehtoja kuvataan tässä:

  • -d : Sijoita luodut tiedostot tähän hakemistoon.
  • -p : Sijoita luodut tiedostot tähän pakettiin.
  • -nv: Älä tarkista syöttökaavaa tarkasti.
  • -httpproxy : Käytä tätä, jos olet välityspalvelimen takana. Ottaa muodon [käyttäjä [: salasana] @] proxyHost [: proxyPort].
  • -polku : Määritä luokan polku tarvittaessa.
  • -Lue ainoastaan: Luo vain luku -lähdekooditiedostot, jos käyttöjärjestelmäsi tukee tätä.

On myös vastaava muurahainen Tehtävä, jonka ansiosta integrointi muurahais- tai Maven-pohjaiseen rakennusprosessiin on melko helppoa.

Luettujen luokkien luettelo näkyy tässä:

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

JAXB: n aiempien versioiden käyttäjät saattavat huomata, että tämä on huomaamaton ja täysin dokumentoitu Java-luokka, eikä aiempien versioiden raskaampi rajapinta ja toteutus. Siten meillä on vähemmän generoituja luokkia ja kevyempi ja tyylikkäämpi koodi. Ja kuten seuraavasta osiosta näet, näiden luokkien käsittely on helppoa.

XML-asiakirjan purkaminen

Poistaminen on prosessi, jolla XML-asiakirja muunnetaan vastaavaksi Java-objektijoukoksi. JAXB 2.0: n purkaminen on helppoa. Ensin luot a JAXBContext kontekstikohde. Kontekstiobjekti on lähtökohta järjestely-, purkamis- ja validointitoiminnoille. Tässä määritetään Java-paketti, joka sisältää JAXB-kartoitetut luokat:

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

Voit purkaa XML-asiakirjan hallinnan luomalla Unmarshaller kontekstista, kuten tässä on esitetty:

 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller ();

unmarshaller pystyy käsittelemään XML-tietoja monenlaisista tietolähteistä: tiedostoista, syöttövirroista, URL-osoitteista, DOM-objekteista, SAX-jäsentäjistä ja muusta. Tässä tarjoamme yksinkertaisen Tiedosto XML-asiakirjaamme osoittava objekti. unmarshaller palauttaa kirjoitetun JAXBElement, josta voimme hankkia hallitsemattoman kohteen käyttämällä getValue () menetelmä:

JAXBElement bookingElement = (JAXBElement) unmarshaller.unmarshal (uusi tiedosto ("src / test / resources / xml / booking.xml"));

CourseBooking booking = bookingElement.getValue ();

Asiakirjan vahvistus

Asiakirjan vahvistus on prosessi, jolla varmistetaan, että XML-asiakirjasi vastaa vastaavassa XML-skeemassa annettua määritelmää. Se on tärkeä näkökohta kaikissa XML-vaihtoon liittyvissä projekteissa, varsinkin jos XML tulee muista järjestelmistä. JAXB 2.0: n asiakirjojen vahvistus on helpompaa ja joustavampaa kuin edellisissä versioissa. Voit yksinkertaisesti liittää a ValidatonEventHandler että unmarshaller ennen XML-asiakirjan purkamista, kuten tässä on esitetty:

 unmarshaller.setEventHandler (uusi BookingValidationEventHandler ());

Vahvistustapahtumien käsittelijä toteuttaa ValidationEventHandler käyttöliittymä ja kahvaEvent () menetelmä, kuten tässä on esitetty:

public class BookingValidationEventHandler toteuttaa ValidationEventHandler {

public boolean handleEvent (ValidationEvent ve) {

if (ve.getSeverity () == ValidationEvent.FATAL_ERROR || ve .getSeverity () == ValidationEvent.ERROR) {ValidationEventLocator locator = ve.getLocator (); // Tulosta viesti hallitustapahtumasta System.out.println ("Virheellinen varausasiakirja:" + locator.getURL ()); System.out.println ("Virhe:" + ve.getMessage ()); // Lähtörivin ja sarakkeen numero System.out.println ("Virhe sarakkeessa" + locator.getColumnNumber () + ", rivi" + locator.getLineNumber ()); } return true; }}

Tulostamme vain virheen yksityiskohdat, mutta todellisessa sovelluksessa jotkut vähemmän merkityksettömät kohtelut saattavat olla sopivia. Joissakin tapauksissa saatat jopa ajatella, että vahvistusvirhe ei ole show-stopper ja että se ei estä käsittelyä. Palauttamalla true, kerrot unmhallhaller jatkaaksesi purkamisprosessia: epätosi lopettaa prosessin asianmukaisella poikkeuksella.

Asiakirjan esittely

Järjestelyyn kuuluu Java-luokkien muuttaminen XML-muotoon. JAXB 2.0: ssa näiden Java-luokkien luominen ja käsittely on yksinkertaista. Useimmissa tapauksissa voit vain kohdella heitä tavallisten Java-luokkien tavoin, kuten tässä on esitetty:

 CourseBooking-varaus = uusi CourseBooking (); booking.setCourseReference ("UML-101"); booking.setTotalPrice (uusi BigDecimal (10000)); ...

Huomaa, että voit silti käyttää ObjectFactory luokka samalla tavalla kuin käytit sitä JAXB 1.0: ssa, kuten seuraavassa luettelossa näkyy. Toisin kuin JAXB 1.0, ei kuitenkaan ole käyttöliittymiä tai toteutusluokkia: kaikki toimialueobjektit ovat vain merkittyjä JavaBeans-komponentteja.

 ObjectFactory-tehdas = uusi ObjectFactory (); CourseBooking booking = tehdas.createCourseBooking (); ...

Vaikka suurin osa XML-tietotyypeistä kartoitetaan suoraan normaaleihin Java-luokkiin, joillekin tietotyypeille, kuten päivämäärille, tarvitaan erityistä käsittelyä. Näissä tapauksissa sinun on käytettävä DatatypeFactory, kuten tässä on esitetty:

 DatatypeFactory datatyypit = DatatypeFactory.newInstance (); booking.setCourseDate (tietotyypit.newXMLGregorianCalendarDate (2006,06,15,0));

Kun toimialueesi objekti on alustettu, luo JAXB-konteksti Marshaller esine ja kirjoitettu JAXBElement. Luominen marshaller on yksinkertainen:

 Marshaller marshaller = jaxbContext.createMarshaller ();

Seuraavaksi luot a JAXBElement objekti, joka kapseloi toimialueesi objektin. Kirjoitettu JAXBElement vastaa juurielementtiä complexType XML-dokumenttisi. Käytä sitten luotua ObjectFactory luokka seuraavasti:

 JAXBElement bookingElement = (uusi ObjectFactory ()). CreateBooking (varaus);

Tässä esimerkissä asetamme ominaisuuden niin, että lähtö muotoillaan ihmisille ja kirjoitetaan sitten vakiotulosteeseen:

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

Tässä näytetään täydellinen koodinäyte:

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

CourseBooking-varaus = uusi CourseBooking (); booking.setCourseReference ("UML-101"); booking.setTotalPrice (uusi BigDecimal (10000)); booking.setInvoiceReference ("123456"); DatatypeFactory datatyypit = DatatypeFactory.newInstance (); booking.setCourseDate (tietotyypit.newXMLGregorianCalendarDate (2006,06,15,0)); booking.setTotalPrice (uusi BigDecimal (10000)); booking.setInvoiceReference ("123456"); booking.getStudent (). add (uusi StudentType ()); booking.getStudent (). get (0) .setFirstName ("John"); booking.getStudent (). get (0) .setSurname ("Smith"); booking.setCompany (uusi yritystyyppi ()); booking.getCompany (). setName ("Asiakkaat mukaan lukien"); booking.getCompany (). setContact (uusi ContactType ()); booking.getCompany (). getContact (). setName ("Paul"); booking.getCompany (). getContact (). setEmail ("[email protected]"); booking.getCompany (). getContact (). setTelephone ("12345678"); booking.getCompany (). setAddress ("10 asiakaskatu");

// Marsalkka System.out Marshallerille marshaller = jaxbContext.createMarshaller (); JAXBElement bookingElement = (uusi ObjectFactory ()). CreateBooking (varaus); marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolen.TRUE);

marshaller.marshal (bookingElement, System.out);

Tämän koodin suorittaminen tuottaa jotain tällaista: