Programiranje

Preprosto preslikava Java-XML z JAXB 2.0

Java Architecture for XML Binding nudi močan in praktičen način dela z vsebinami XML znotraj aplikacij Java. Novo izdana različica JAXB 2.0 ponuja številne nove funkcije, vključno s popolno podporo vseh funkcij sheme XML, bistveno manj ustvarjenih razredov, generiranih razredov, ki jih je lažje upravljati, in prilagodljivejši mehanizem preverjanja veljavnosti.

Da bi razumeli, kako obdelati dokumente XML v Javi z JAXB 2.0, si moramo ogledati dve glavni komponenti JAXB:

  • Prevajalnik vezi, ki veže dano shemo XML na nabor ustvarjenih razredov Java
  • Vezavni okvir izvajalnega okolja, ki zagotavlja funkcije za razvrščanje, razvrščanje in preverjanje veljavnosti

Prevajalnik vezav JAXB (ali xbj) vam omogoča generiranje razredov Java iz dane sheme XML. Prevajalnik vezav JAXB pretvori shemo XML v zbirko razredov Java, ki se ujemajo s strukturo, opisano v shemi XML. Ti razredi so označeni s posebnimi pripisi JAXB, ki zagotavljajo izvajalnemu okviru preslikave, ki jih potrebuje za obdelavo ustreznih dokumentov XML.

Vezavni izvajalni okvir zagotavlja učinkovit in enostaven mehanizem za razveljavitev (ali branje) in razvrščanje (ali pisanje) dokumentov XML. Omogoča vam pretvorbo dokumenta XML v hierarhijo predmetov Java (neomejeno razvrščanje) ali obratno, pretvorbo hierarhije predmetov Java v obliko XML (razvrščanje). Izraz ranžiranje tradicionalno se nanaša na odstranjevanje vojakov na primeren način. Pri mreženju se nanaša na postavitev podatkovnih elementov v medpomnilnik, preden jih pošljete po komunikacijskem kanalu.

Ti dve komponenti skupaj ustvarjata tehnologijo, ki razvijalcem Java omogoča enostavno upravljanje s podatki XML v obliki predmetov Java, ne da bi morali poznati podrobne podrobnosti enostavnega API-ja za obdelavo XML (SAX) ali objektnega modela dokumenta (DOM) ali celo subtilnosti sheme XML.

Predpogoji za JAXB

Za začetek uporabe JAXB 2.0 potrebujete:

  • Java Platform, standardna izdaja 5: JAXB 2.0 se močno opira na funkcije Java SE 5, kot so opombe in generiki
  • Izvedba JAXB 2.0

Ta članek je bil napisan z uporabo kandidata za referenčno izvedbo GlassFish JAXB.

Ustvari razrede Java z uporabo prevajalnika JAXB

Prevajalnik JAXB veže shemo XML na nabor razredov Java. Shema XML je dokument XML, ki zelo natančno opisuje elemente in atribute, odobrene v določeni vrsti dokumenta XML. V tem primeru uporabljamo sistem rezervacij tečajev, ki lahko sprejema naročila v obliki XML. Tipično naročilo je videti tako:

    10 Coyote Avenue, Arizona, ZDA 

Ustrezna shema XML opisuje, kako je rezerviran tečaj, in vsebuje podrobnosti o rezerviranem tečaju, vpisanih študentih, podjetju, ki je opravilo rezervacijo itd. Opis sheme XML je izredno strog in lahko vključuje podrobnosti, kot je dovoljeno število elementov na seznamu predmetov (kardinalnost), neobvezni in obvezni atributi in še več. Shema za rezervacije tečajev (imenovana tečaj-booking.xsd) je prikazan tukaj:

Orodje ukazne vrstice xjc zažene prevajalnik JAXB. Za zagon prevajalnika JAXB proti naši shemi zaženemo naslednji ukaz:

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

To bo ustvarilo nabor razredov Java, označenih s pripisi JAXB 2.0. Tu so opisane nekatere uporabnejše možnosti:

  • -d : Generirane datoteke postavite v ta imenik.
  • -p : Ustvarjene datoteke položite v ta paket.
  • -nv: Ne izvajajte stroge validacije vhodne sheme.
  • -httpproxy : Uporabite to, če ste za pooblaščencem. Zavzame obliko [uporabnik [: geslo] @] proxyHost [: proxyPort].
  • -razredna pot : Po potrebi navedite pot razreda.
  • -le za branje: Ustvari datoteke z izvorno kodo samo za branje, če vaš operacijski sistem to podpira.

Obstaja tudi enakovreden Mravlja naloga, ki jo je povsem enostavno vključiti v postopek gradnje na osnovi Ant ali Maven.

Seznam ustvarjenih razredov je prikazan tukaj:

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

Uporabniki prejšnjih različic JAXB bodo morda opazili, da gre za gladki nabor označenih in v celoti dokumentiranih razredov Java, ne pa za bolj okoren nabor vmesnikov in izvedb prejšnjih različic. Tako imamo manj ustvarjenih razredov, lažjo in elegantnejšo kodo. Kot boste videli v naslednjem poglavju, je upravljanje s temi razredi enostavno.

Odstranjevanje oznake dokumenta XML

Odstranjevanje oznake je postopek pretvorbe dokumenta XML v ustrezen nabor predmetov Java. Odstranitev oznake v JAXB 2.0 je enostavna. Najprej ustvarite datoteko JAXBContext predmet konteksta. Objekt konteksta je izhodišče za operacije razvrščanja, razvrščanja in preverjanja veljavnosti. Tukaj določite paket Java, ki vsebuje vaše razporejene razrede JAXB:

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

Če želite odstraniti oznako dokumenta XML, ustvarite datoteko Unmarshaller iz konteksta, kot je prikazano tukaj:

 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller ();

The unmarshaller lahko obdeluje podatke XML iz najrazličnejših virov podatkov: datotek, vhodnih tokov, URL-jev, predmetov DOM, razčlenjevalnikov SAX in še več. Tu ponujamo preprosto mapa objekt, ki kaže na naš dokument XML. The unmarshaller vrne tipkano JAXBElement, iz katerega lahko z neobdelanim predmetom dobimo z getValue () metoda:

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

Rezervacija tečajev = bookingElement.getValue ();

Potrditev dokumenta

Potrditev dokumenta je postopek, s katerim zagotovite, da vaš dokument XML ustreza definiciji, podani v ustrezni shemi XML. To je pomemben vidik vsakega projekta, ki vključuje izmenjave XML, še posebej, če XML prihaja iz drugih sistemov. Preverjanje veljavnosti dokumentov v JAXB 2.0 je enostavnejše in bolj prilagodljivo kot v prejšnjih različicah. Lahko preprosto pritrdite ValidatonEventHandler do unmarshaller preden odstranite oznako XML iz dokumenta, kot je prikazano tukaj:

 unmarshaller.setEventHandler (novo BookingValidationEventHandler ());

Obdelovalec dogodkov preverjanja izvaja ValidationEventHandler vmesnik in handleEvent () metoda, kot je prikazano tukaj:

javni razred BookingValidationEventHandler implementira ValidationEventHandler {

javni logični handleEvent (ValidationEvent ve) {

if (ve.getSeverity () == ValidationEvent.FATAL_ERROR || ve .getSeverity () == ValidationEvent.ERROR) {ValidationEventLocator locator = ve.getLocator (); // Natisni sporočilo iz dogodka valdation System.out.println ("Neveljaven dokument rezervacije:" + locator.getURL ()); System.out.println ("Napaka:" + ve.getMessage ()); // številka izhodne vrstice in stolpca System.out.println ("Napaka v stolpcu" + locator.getColumnNumber () + ", vrstica" + locator.getLineNumber ()); } vrni true; }}

Tu samo natisnemo podrobnosti o napaki, toda v resnični aplikaciji bi bilo morda primerno nekaj manj trivialnega zdravljenja. V nekaterih primerih lahko celo pomislite, da napaka pri preverjanju ni zapora in da ne bo blokirala obdelave. Če se vrnete res, povete unmarshaller za nadaljevanje postopka odstranjevanja oznake: false bi postopek končal z ustrezno izjemo.

Označevanje dokumenta

Marshalling vključuje pretvorbo razredov Java v format XML. V JAXB 2.0 je ustvarjanje in upravljanje teh razredov Java preprosto. V večini primerov jih lahko obravnavate kot običajne razrede Java, kot je prikazano tukaj:

 Rezervacija tečajev = nova CourseBooking (); booking.setCourseReference ("UML-101"); booking.setTotalPrice (novo BigDecimal (10000)); ...

Upoštevajte, da lahko še vedno uporabljate ObjectFactory razred, podobno kot ste ga uporabljali v JAXB 1.0, kot je prikazano v naslednjem seznamu. Vendar v nasprotju z JAXB 1.0 ni vmesnikov ali razredov izvedbe: vsi objekti domene so samo označeni elementi JavaBeans.

 ObjectFactory factory = nova ObjectFactory (); Rezervacija tečajev = factory.createCourseBooking (); ...

Čeprav se večina podatkovnih vrst XML preslika neposredno v običajne razrede Java, je za nekatere vrste podatkov, kot so datumi, potrebna posebna obravnava. V teh primerih morate uporabiti Tip podatkovFactory, kot je prikazano tukaj:

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

Ko je objekt domene inicializiran, uporabite kontekst JAXB, da ustvarite datoteko Marshaller predmet in vtipkan JAXBElement. Ustvarjanje maršaler je preprosto:

 Marshaller marshaller = jaxbContext.createMarshaller ();

Nato ustvarite datoteko JAXBElement objekt, ki zajema vaš domenski objekt. Vtipkani JAXBElement ustreza korenskemu elementu complexType dokumenta XML. Nato uporabite ustvarjeno ObjectFactory razred, kot sledi:

 JAXBElement bookingElement = (new ObjectFactory ()). CreateBooking (booking);

V tem primeru smo nastavili lastnost, tako da bo izhod formatiran za človeško uporabo in nato zapisal v standardni izhod:

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

Tu je prikazan celoten vzorec kode:

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

Rezervacija tečajev = nova rezervacija tečajev (); booking.setCourseReference ("UML-101"); booking.setTotalPrice (novo BigDecimal (10000)); booking.setInvoiceReference ("123456"); DatatypeFactory datatypes = DatatypeFactory.newInstance (); booking.setCourseDate (datatypes.newXMLGregorianCalendarDate (2006,06,15,0)); booking.setTotalPrice (novo BigDecimal (10000)); booking.setInvoiceReference ("123456"); booking.getStudent (). add (new StudentType ()); booking.getStudent (). get (0) .setFirstName ("John"); booking.getStudent (). get (0) .setSurname ("Smith"); booking.setCompany (nov tip podjetja ()); booking.getCompany (). setName ("Stranke vklj."); booking.getCompany (). setContact (nov ContactType ()); booking.getCompany (). getContact (). setName ("Paul"); booking.getCompany (). getContact (). setEmail ("[email protected]"); booking.getCompany (). getContact (). setTelephone ("12345678"); booking.getCompany (). setAddress ("ulica 10 strank");

// Maršal na System.out Marshaller marshaller = jaxbContext.createMarshaller (); JAXBElement bookingElement = (new ObjectFactory ()). CreateBooking (booking); marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

marshaller.marshal (bookingElement, System.out);

Zagon te kode bo ustvaril nekaj takega:

$config[zx-auto] not found$config[zx-overlay] not found