Ohjelmointi

Java-objektikyselyt käyttämällä JXPathia

Tarvitsin äskettäisessä projektissa helpon tavan kulkea Java-objektipuita ja poimia arvoja esineistä. Sen sijaan, että jatkaisin jatkuvasti valtavia iteraattori-jos-muu-asetuksia, halusin työkalun, jonka avulla voisin yksinkertaisesti sanoa: "Haluan objektin, jonka id = X, ja tältä objektilta tarvitsen ominaisuuden A arvon." Pohjimmiltaan tarvitsin objektikyselytyökalun.

JXPath on sellainen objektikyselytyökalu. Se on Apache Commons -komponentti, jonka avulla voit tehdä kyselyjä monimutkaisista objektipuista käyttämällä tunnettua XPath-lausekekieltä. Käytin JXPathia laajalti projektissani, ja se nopeutti asioita huomattavasti, mikä lisäsi arvon purkamisalgoritmeja.

JXPathia ei kuitenkaan ole laajalti dokumentoitu. Koska tutkin komponenttia joka tapauksessa perusteellisesti, päätin kirjoittaa löydökseni laajaan JXPath-opetusohjelmaan, jonka löydät verkkosivustoltani. Tämä artikkeli on lyhyt versio tästä opetusohjelmasta, jotta pääset alkuun JXPathin kanssa nopeasti.

Huomaa: Voit ladata oheisen mallikoodin Resursseista.

Esimerkki mallista

Havainnollistamista varten käytämme yksinkertaista mallia: a yhtiö eri kanssa osastot, jokaisella on erilaisia työntekijät. Tässä on luokan malli:

Luonnollisesti tarvitsemme mallia varten joitain näytetietoja:

Yhtiö

Osasto

Työntekijä (nimi, työnimike, ikä)

Acme Inc.

Myynti

Johnny, myyntiedustaja, 45

Sarah, myyntiedustaja, 33

Magda, toimistoavustaja, 27

Kirjanpito

Steve, pääohjain, 51

Peter, apulaisohjaaja, 31

Susan, toimistoavustaja, 27

Kun se on paikallaan, aloitetaan JXPathin käyttö!

Yksinkertaisten JXPath-kyselyjen suorittaminen

Yksinkertaisin mahdollinen kysely poimii yhden objektin objektipuusta. Esimerkiksi hakeaksesi Yhtiö, käytä seuraavaa koodia:

JXPathContext-konteksti = JXPathContext.newContext (yritys); Yritys c = (Yritys) context.getValue (".");

Ensimmäisellä rivillä näkyy a yhteydessä, kaikkien JXPathin XPath-lausekkeiden lähtökohta objektipuussa (verrattavissa rootnode XML-asiakirjan elementti). Toinen koodirivi suorittaa varsinaisen kyselyn. Koska meidän yhteydessä alkaa yrityksen tasolla, hakemaan Yhtiö objekti, käytämme yksinkertaisesti nykyisen elementin valitsinta '.'.

Käyttämällä predikaatteja ja muuttujia

An Työntekijä on a: n lapsiobjekti Osasto. Voit hakea Työntekijä nimeltään "Johnny", käytä seuraavaa koodia (Yhtiö on edelleen yhteydessälähtökohta):

Työntekijän emp = (työntekijä) context.getValue ("/ departmentList / työntekijät [nimi = 'Johnny']");

Pohjimmiltaan koodi kuuluu: "Hae kaikista Osastos alusta alkaen Työntekijä kohde, jonka nimi attribuutilla on arvo 'Johnny'."

Yllä oleva koodinpätkä kuvaa, miten predikaattia voidaan käyttää objektien etsimiseen tiettyjä arvoja käyttämällä. Predikaattien käyttö on verrattavissa WHERE-lausekkeen käyttöön SQL: ssä. Voimme jopa yhdistää useita predikaatteja yhteen kyselyyn:

Työntekijän emp = (työntekijä) context.getValue ("/ departmentList / työntekijät [nimi = 'Susan' ja ikä = 27]");

Ellet käytä tapauskohtaista, kertaluonteista kyselyä, kovakoodattujen kyselyjen toteuttaminen ei yleensä ole mahdollista. On parempi määrittää uudelleenkäytettävä kysely, jonka voit suorittaa sitten eri parametreilla. Parametroidun kyselyn huomioon ottamiseksi JXPath tukee muuttujat kyselyissä. Muuttujien avulla yllä oleva koodi näyttää nyt tältä:

context.getVariables (). declareVariable ("nimi""Susan"); context.getVariables (). declareVariable ("ikä", uusi kokonaisluku (27)); Työntekijän emp = (työntekijä) context.getValue ("/ osastoLista / työntekijät [nimi =$ nimi ja ikä =$ ikä]");

Kerääntyy kokoelmiin

JXPath voi tarjota iteraattorin kaikille kyselyllä haetuille objekteille, aivan kuten tulosjoukon iterointi. Seuraava katkelma näyttää, kuinka voit toistaa kaikki Osastos:

for (iteraattori iter = context.iterate ("/ departmentList"); iter.hasNext ();) {osasto d = (osasto) iter.next (); // ...}

Kaikkien hakemiseksi Työntekijäs kaikilta Osastos ja toista niitä:

for (Iterator iter = context.iterate ("/ osastoLista / työntekijät"); iter.hasNext ();) {Employee emp = (Työntekijä) iter.next (); // ...}

Kaikkien hakemiseksi Työntekijäyli 30-vuotiaat myyntiosastolta:

for (Iterator iter = context.iterate ("/ departmentList [name = 'Myynti'] / työntekijät [ikä> 30]"); iter.hasNext ();) {Employee emp = (Työntekijä) iter.next (); // ...}

Ja yllä oleva esimerkki muuttujilla:

context.getVariables (). declareVariable ("deptName""Myynti"); context.getVariables (). declareVariable ("minAge", uusi kokonaisluku (30)); for (Iterator iter = context.iterate ("/ osastoLista [nimi =$ deptName] / työntekijät [ikä>$ minAge] "); iter.hasNext ();) {Employee emp = (Employee) iter.next (); // ...}

Nämä kaksi viimeistä koodinpätkää osoittavat myös useiden predikaattien käytön yhdessä XPath-kyselyssä.

Osoittimet

A Osoitin on JXPath-apuohjelmaobjekti, joka edustaa viittausta objektin sijaintiin objektipuussa. Esimerkiksi a Osoitin saattaa viitata "toisen osaston ensimmäiseen työntekijään". Verrattuna suoraan puusta haettuihin esineisiin OsoitinNe tarjoavat lisätoimintoja, kuten suhteelliset kyselyt kautta suhteelliset yhteydet (lisää tästä myöhemmin).

Osoittimien käyttäminen

Ottaa a Osoitin viitata objektiin objektipuussa on melkein identtinen suoraan haettavien objektien kanssa:

JXPathContext context = JXPathContext.newContext (yritys); Osoitin empPtr = konteksti.getPointer("/ departmentList [nimi = 'Myynti'] / työntekijät [ikä> 40]"); System.out.println (empPtr); // tuotos: / osastoLista [1] / työntekijät [1] System.out.println (((Työntekijä) empPtr.getValue ()) .getName ()); // tuotos: Johnny

Huomaa, että Osoitintuotos osoittaa, että a Osoitin kuvaa kohteen sijaintia itse objektin sijasta. Huomaa myös, että todellinen kohde Osoitin viittaa voidaan hakea Osoitinon getValue () menetelmä.

Osoittimet voidaan myös toistaa, kuten seuraava katkelma osoittaa:

for (Iterator iter = konteksti.iteratePointers("/ departmentList [nimi = 'Myynti'] / työntekijät [ikä> 30]"); iter.hasNext ();) {Osoitin empPtr = (Osoitin) iter.next (); // ...}

Suhteellinen konteksti ja suhteelliset kyselyt

Koska a Osoitin kuvaa sijaintia, sitä voidaan käyttää viitepisteenä navigoitaessa koko objektipuun läpi. Voit tehdä sen käyttämällä Osoitin pääobjektina (muista käyttää Yhtiö esine aiemmin?) ns suhteellinen konteksti. Tästä suhteellisesta asiayhteydestä voit kysellä koko objektipuuta suorittamalla suhteelliset kyselyt. Tämä kehittyneempi käyttö Osoitins tarjoaa suurta joustavuutta, kuten alla olevat esimerkit havainnollistavat.

Aluksi, miten luot suhteellisen kontekstin:

for (Iterator iter = context.iteratePointers ("/ departmentList [nimi = 'Myynti'] / työntekijät [ikä> 30]"); iter.hasNext ();) {Osoitin empPtr = (Osoitin) iter.next (); JXPathContext suhteellinen konteksti = context.getRelativeContext (empPtr); }

Tässä koodinpätkässä luodaan uusi suhteellinen konteksti peräkkäisille työntekijä viitteitä.

Suhteellisen kontekstin avulla XPath-kyselyt voidaan suorittaa sisarusten, lasten sekä vanhempien / isovanhempien objektien koko objektipuussa, kuten seuraava katkelma osoittaa:

// Nykyinen työntekijä Employee emp = (Employee) relativeContext.getValue ("."); // Työntekijän nimi Merkkijonon nimi = (Merkkijono) relativeContext.getValue ("./nimi"); // Osaston nimi, johon tämä työntekijä kuuluu (pääobjekti) String deptName = (Merkkijono) relativeContext.getValue ("../ name"); // Yrityksen nimi, johon tämä työntekijä kuuluu ('isovanhempi' -objekti) String compName = (String) relativeContext.getValue ("../../ name"); // Tämän työntekijän kaikki työtoverit (sisarobjektit) kohteelle (Iterator empIter = relativeContext.iterate ("../ työntekijät"); empIter.hasNext ();) {Työntekijäkollega = (Employee) empIter.next (); // ...}

Yhteenveto

JXPath on erittäin hyödyllinen työkalu monimutkaisten objektipuiden kulkemiseen, navigointiin ja kyselyihin. Koska se käyttää kyselyihinsä XPath-lausekekieltä, käytettävissä on suuri joukko viitemateriaalia, joka auttaa sinua rakentamaan tehokkaita mutta monimutkaisia ​​objektinhakukyselyjä. Vielä enemmän joustavuutta lisätään käyttämällä Osoitins ja suhteelliset yhteydet.

Tämä lyhyt artikkeli vain naarmuttaa JXPathin mahdollisuuksien pintaa.Lue täydellinen opetusohjelma, jos haluat keskustella perusteellisemmin edistyneempien käyttöesimerkkien kanssa.

Bart van Riel on ollut mukana Java- ja olio-maailmassa yli seitsemän vuoden ajan. Hän on työskennellyt sekä kehittäjänä että kouluttajana olio- ja Java-kentillä. Hän työskentelee tällä hetkellä globaalissa tietotekniikkakonsulttiyrityksessä Capgemini ohjelmistoarkkitehtina ja avoimen lähdekoodin päähenkilönä.

Lisätietoja tästä aiheesta

  • Lataa tämän artikkelin lähdekoodi
  • Katso koko JXPath-opetusohjelma
  • Apache Commons JXPath
  • Hyvä XPath-opetusohjelma
  • Selaa artikkeleita JavaWorldon Kehitystyökalut Tutkimuskeskus
  • Pysy ajan tasalla uusista asioista JavaWorld! Rekisteröidy ilmaiseksi Enterprise Java uutiskirje

Tämän tarinan "Java-objektikyselyt käyttämällä JXPathia" julkaisi alun perin JavaWorld.

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