Programavimas

XML programavimas „Java“, 1 dalis

Taigi, jūs suprantate (daugiau ar mažiau), kaip pavaizduotumėte savo duomenis XML, ir jus domina naudoti XML norint išspręsti daugelį jūsų duomenų valdymo problemų. Vis dėlto nesate tikri, kaip naudoti XML su „Java“ programomis.

TEXTBOX: TEXTBOX_HEAD: XML programavimas „Java“: perskaitykite visą seriją!

  • 1 dalis. Jei norite lengvai apdoroti XML „Java“, naudokite paprastą API XML (SAX)
  • 2 dalis. Sužinokite apie SAX ir XML patvirtinimą naudodamiesi iliustraciniais pavyzdžiais
  • 3 dalis. DOMINAVIMAS: Perimkite struktūrinių dokumentų valdymą naudodami dokumento objekto modelį

: END_TEXTBOX

Šis straipsnis yra tęsinys po mano įvadinio straipsnio „XML absoliučiai pradedantiesiems“, išleistame 1999 m. Balandžio mėn. „JavaWorld“ (URL rasite toliau esančiame skyriuje „Ištekliai“). Tame straipsnyje aprašyta XML; Dabar remsiuosi tuo aprašymu ir išsamiai parodysiu, kaip sukurti programą, naudojančią paprastą „Java“ API (SAX), lengvą ir galingą standartinę „Java“ API, skirtą XML apdoroti.

Čia naudojamas kodo pavyzdys naudoja SAX API skaityti XML failą ir sukurti naudingą objektų struktūrą. Kai baigsite šį straipsnį, būsite pasirengę sukurti savo XML pagrindu sukurtas programas.

Tingėjimo dorybė

Larry Wallas, beprotiškas genialus „Perl“ (antros pagal dydį egzistuojančios programavimo kalbos) kūrėjas, pareiškė, kad tingumas yra viena iš „trijų didžiųjų programuotojo dorybių“ (kitos dvi yra nekantrumas ir hubris). Tingumas yra dorybė, nes tingus programuotojas imsis beveik bet kokio ilgio, kad išvengtų darbo, net ir kurdamas bendras, daugkartinio naudojimo programavimo sistemas, kurias galima naudoti pakartotinai. Kuriant tokias sistemas reikia įdėti daug darbo, tačiau laikas, sutaupytas būsimoms užduotims atlikti, daugiau nei kompensuoja pradines įdėtas pastangas. Geriausios sistemos leidžia programuotojams atlikti nuostabius dalykus, dirbant nedaug arba be jokio darbo - todėl tingumas yra dorybingas.

XML yra įgalinanti technologija doram (tingiam) programuotojui. Pagrindinis XML analizatorius programuotojui padaro daug darbo, atpažindamas žetonus, verčdamas užkoduotus simbolius, vykdydamas XML failų struktūros taisykles, tikrindamas kai kurių duomenų reikšmių pagrįstumą ir prireikus paskambindamas į konkrečios programos kodą. Tiesą sakant, ankstyvas standartizavimas kartu su įnirtingai konkuruojančia rinka davė daugybę rezultatų laisvai galimi standartinių XML analizatorių variantai daugeliu kalbų, įskaitant C, C ++, Tcl, Perl, Python ir, žinoma, Java.

SAX API yra viena iš paprasčiausių ir lengviausių XML tvarkymo sąsajų. Šiame straipsnyje aš naudosiu IBM XML4J SAX diegimą, tačiau kadangi API yra standartizuota, jūsų programa gali pakeisti bet kurį paketą, kuriame įdiegta SAX.

SAX yra įvykiais pagrįsta API, veikianti pagal atgalinio ryšio principą. Programų programuotojas paprastai sukurs SAX Analizatorius objektą ir perduokite jam tiek įvesties XML, tiek a dokumentų tvarkytojas, kuri gauna atgalinius skambučius už SAX įvykius. SAX Analizatorius konvertuoja savo įvestį į įvykius atitinkančios struktūrines įvesties ypatybes, tokias kaip XML žymos ar teksto blokai. Kiekvienam įvykiui įvykus, jis perduodamas atitinkamam programuotojo nustatyto dokumentų tvarkytojo metodui, kuris įgyvendina atgalinio ryšio sąsają org.xml.sax.DocumentHandler. Šios tvarkymo klasės metodai analizės metu atlieka konkrečios programos funkcionalumą.

Pavyzdžiui, įsivaizduokite, kad SAX analizatorius gauna dokumentą, kuriame yra mažas XML dokumentas, parodytas toliau pateiktame 1 sąraše. (Žr. XML failo išteklius.)

 Ogden Nash blusos Adamas turėjo juos. 

Sąrašas 1. XML, vaizduojantis trumpą eilėraštį

Kai SAX analizatorius susiduria su žymą, ji iškviečia vartotojo apibrėžtą „DocumentHandler.startElement“ () su styga EILĖRAŠTIS kaip argumentą. Jūs įgyvendinate startElement () metodas daryti viską, kas skirta programai, kai a EILĖRAŠTIS prasideda. Įvykių srautas ir dėl to iškviesti aukščiau esančio XML fragmentai rodomi toliau pateiktoje 1 lentelėje.

1 lentelė. „SAX“ skambučių seka analizuojant 1 sąrašą
Elementas sutiktasAnalizatoriaus atgalinis skambutis
{Dokumento pradžia}startDocument ()
startElement („POEM“, {AttributeList})
"\ n"simbolių („\ n ...“, 6, 1)
startElement („AUTHOR“, {AttributeList})
„Ogden Nash“simbolių („\ n ...“, 15, 10)
endElement („AUTHOR“)
"\ n"simbolių („\ n ...“, 34, 1)
startElement („TITLE“, {AttributeList})
„Blusos“simbolių („\ n ...“, 42, 5)
„endElement“ („TITLE“)
"\ n"simbolių („\ n ...“, 55, 1)
startElement ("LINE", {AttributeList})
„Adomas“simbolių („\ n ...“, 62, 4)
„endElement“ („LINE“)
startElement ("LINE", {AttributeList})
- Turėjo juos.simbolių („\ n ...“, 67, 8)
„endElement“ („LINE“)
"\ n"simbolių („\ n ...“, 82, 1)
„endElement“ („POEMA“)
{Dokumento pabaiga}endDocument ()

Jūs sukuriate klasę, kuri įgyvendina „DocumentHandler“ reaguoti į įvykius, vykstančius SAX analizatoriuje. Šie įvykius nėra „Java“ įvykiai, nes juos galite žinoti iš „Abstract Windowing Toolkit“ (AWT). Tai sąlygos, kurias SAX analizatorius aptinka analizuodamas, pvz., Dokumento pradžia arba uždarymo žymos atsiradimas įvesties sraute. Įvykus kiekvienai iš šių sąlygų (ar įvykių), SAX iškviečia jos sąlygą atitinkantį metodą „DocumentHandler“.

Taigi, norint rašyti programas, apdorojančias XML su SAX, svarbiausia išsiaiškinti, kas yra „DocumentHandler“ turėtų atsakyti į metodo atšaukimą iš SAX srauto. „SAX“ analizatorius rūpinasi visa žymių identifikavimo, objekto reikšmių pakeitimo ir kt. Mechanika, paliekant jums laisvę susitelkti į konkrečios programos funkcionalumą, kuris naudoja XML užkoduotus duomenis.

1 lentelėje rodomi tik įvykiai, susieti su elementais ir simboliais. SAX taip pat apima galimybes tvarkyti kitas struktūrines XML failų ypatybes, pvz., Objektus ir apdorojimo instrukcijas, tačiau jos nepatenka į šio straipsnio taikymo sritį.

Įžvalgus skaitytojas pastebės, kad XML dokumentas gali būti pavaizduotas kaip surinktų objektų medis ir kad įvykių srauto tvarka pateikiama „DocumentHandler“ atitinka tvarkingą, visų gylio dokumentų medžio perėjimą. (Nebūtina suprasti šio punkto, tačiau XML dokumento, kaip medžio duomenų struktūros, samprata yra naudinga sudėtingesniems dokumentų apdorojimo tipams, kurie bus aptariami vėlesniuose šios serijos straipsniuose.)

Raktas norint suprasti, kaip naudotis SAX, yra supratimas apie „DocumentHandler“ sąsają, kurią aptarsiu toliau.

Tinkinkite analizatorių naudodami org.xml.sax.DocumentHandler

Kadangi „DocumentHandler“ sąsaja yra tokia svarbi apdorojant XML su SAX, verta suprasti, ką daro sąsajos metodai. Šiame skyriuje aprašysiu pagrindinius metodus ir praleisiu tuos, kurie nagrinėja pažangesnes temas. Prisiminti, „DocumentHandler“ yra sąsaja, todėl aprašomi metodai yra metodai, kuriuos įgyvendinsite tvarkydami konkrečios programos funkcionalumą, kai tik įvyksta atitinkamas įvykis.

Dokumento inicijavimas ir valymas

Kiekvienam išanalizuotam dokumentui SAX XML analizatorius iškviečia „DocumentHandler“ sąsajos metodai startDocument () (paskambino prieš pradedant apdoroti) ir endDocument () (iškviestas, kai apdorojimas baigtas). Jei norite inicializuoti, galite naudoti šiuos metodus „DocumentHandler“ paruošti ją priimti įvykiams ir išvalyti arba pateikti išvestį baigus analizuoti. endDocument () yra ypač įdomus, nes jis vadinamas tik tuo atveju, jei įvesties dokumentas buvo sėkmingai išanalizuotas. Jei Analizatorius generuoja lemtingą klaidą, ji tiesiog nutraukia įvykio srautą ir nustoja analizuoti ir endDocument () niekada neskambina.

Apdorojamos žymos

„SAX“ analizatorius iškviečia startElement () kai tik jis susiduria su atvira žyma ir endElement () kai tik sutinka uždarą žymą. Šiuose metoduose dažnai yra kodas, kuris atlieka didžiąją dalį darbo analizuojant XML failą. startElement ()Pirmasis argumentas yra eilutė, kuri yra aptikto elemento žymos pavadinimas. Antrasis argumentas yra tipo objektas „AttributeList“, sąsaja, apibrėžta pakete org.xml.sax kuri suteikia nuoseklią ar atsitiktinę prieigą prie elementų atributų pagal pavadinimą. (Neabejotinai anksčiau matėte atributus HTML; eilutėje

, SIENA yra atributas, kurio vertė yra "1"). Kadangi 1 sąraše nėra atributų, jie nerodomi 1 lentelėje. Vėliau šiame straipsnyje pamatysite atributų pavyzdžius pavyzdinėje programoje.

Kadangi SAX nepateikia jokios informacijos apie elementų, su kuriais susiduria, kontekstą (tai pasirodo viduje pvz., aukščiau pateiktame 1 sąraše), jūs turite pateikti tą informaciją. Programų programuotojai dažnai naudoja kaupinius startElement () ir endElement (), stumdami objektus ant kamino, kai elementas prasideda, ir iššokant juos iš kamino, kai elementas baigiasi.

Apdoroti teksto blokus

personažai() metodas nurodo simbolių turinį XML dokumente - simbolius, kurie nėra XML žymos viduje, kitaip tariant. Šio metodo parašas yra šiek tiek keistas. Pirmasis argumentas yra baitų masyvas, antrasis yra indeksas į tą masyvą, nurodantis pirmąjį apdorojamo diapazono simbolį, o trečiasis argumentas yra simbolių diapazono ilgis.

Gali atrodyti, kad lengvesnė API paprasčiausiai būtų praėjusi a Stygos objektas, kuriame yra duomenys, bet personažai() buvo apibrėžtas tokiu būdu dėl efektyvumo. Analizatorius negali žinoti, ar naudosite simbolius, ar ne, todėl analizatoriui analizuojant įvesties buferį, jis perduoda nuorodą į buferį ir žiūrimos eilutės indeksus, pasitikėdamas, kad sukursite tavo paties Stygos jei nori. Tai šiek tiek daugiau darbo, tačiau tai leidžia jums nuspręsti, ar jums teks pridengti pridėtines išlaidas Stygos XML failo turinio dalių konstrukcija.

personažai() metodas tvarko tiek įprastą teksto turinį, tiek turinį CDATA skyriuose, kurie naudojami norint išvengti XML analizatoriaus pažodinio teksto blokų analizės.

Kiti metodai

Yra trys kiti metodai „DocumentHandler“ sąsaja: ignorableWhitePace (), apdorojimasInstrukcija ()ir setDocumentLocator (). ignorableWhitePace () praneša apie tarpo atvejus ir paprastai nenaudojamas nepatvirtinant SAX analizatorių (pvz., tą, kurį naudojame šiame straipsnyje); apdorojimasInstrukcija () tvarko daugumą dalykų viduje ir ?> atribotojai; ir setDocumentLocator () yra pasirinktinai įdiegta SAX analizatorių, kad suteiktų jums prieigą prie SAX įvykių vietų pradiniame įvesties sraute. Šiuos metodus galite perskaityti vadovaudamiesi saitais, esančiais SAX sąsajose ištekliuose.

Visų sąsajoje esančių metodų įgyvendinimas gali būti nuobodus, jei jus domina tik vieno ar dviejų jų elgesys. „SAX“ pakete yra klasė, vadinama „HandlerBase“ iš esmės nieko nedaro, bet gali padėti pasinaudoti tik vienu ar dviem iš šių metodų. Panagrinėkime šią klasę išsamiau.

„HandlerBase“: „Nieko nedaryti“ klasė

Dažnai jus domina tik vienas ar du metodai sąsajoje ir norite, kad kiti metodai paprasčiausiai nieko nedarytų. Klasė org.xml.sax.HandlerBase supaprastina programos įgyvendinimą „DocumentHandler“ sąsają įgyvendindami visus sąsajos metodus su nieko neveikiančiais kūnais. Tada, užuot įgyvendinęs „DocumentHandler“, galite pogrupį „HandlerBase“ir nepaisykite tik jus dominančių metodų.

Pavyzdžiui, tarkime, kad norite parašyti programą, kuri tiesiog atspausdino bet kurio XML formato eilėraščio pavadinimą (pvz., „TitleFinder“ 1 sąraše). Galėtumėte apibrėžti naują „DocumentHandler“, kaip ir žemiau esančiame 2 sąraše, šis poklasis „HandlerBase“ir nepaiso tik jums reikalingų metodų. (Žr. HTML failo, esančio „TitleFinder“.)

012 / ** 013 * „SAX DocumentHandler“ klasė, kuri spausdina įvesties dokumento elemento „TITLE“ 014 * turinį. 015 * / 016 viešosios klasės „TitleFinder“ praplečia „HandlerBase“ {017 loginės vertės _isTitle = false; 018 viešasis „TitleFinder“ () {019 super (); 020} 021 / ** 022 * Spausdinkite bet kokį tekstą, esantį a  elementas. 023 * / 024 viešieji niekiniai simboliai (char [] simboliai, int iStart, int iLen) {025 if (_isTitle) {026 String sTitle = nauja eilutė (simboliai, iStart, iLen); 027 System.out.println ("Pavadinimas:" + sTitle); 028} 029} 030 / ** 031 * Pažymėti pavadinimo elemento pabaigą. 032 * / 033 public void endElement (String element) {034 if (element.equals ("TITLE")) {035 _isTitle = false; 036} 037} 038 / ** 039 * Rasti pavadinimų turinį 040 * / 041 public static void main (String args []) {042 TitleFinder titleFinder = new TitleFinder (); 043 pabandykite {044 Parser parser = ParserFactory.makeParser ("com.ibm.xml.parsers.SAXParser"); 045 parser.setDocumentHandler (titleFinder); 046 parser.parse (naujas „InputSource“ (argumentai [0])); 047} sugavimas (ex išimtis) {048; // Gerai, todėl kartais tingumas * nėra * dorybė. 049} 050} 051 / ** 052 * Pažymėti pavadinimo elemento pradžią 053 * / 054 public void startElement (String element, AttributeList attrlist) {055 if (element.equals ("TITLE")) {056 _isTitle = true; 057} 058} 

Sąrašas 2. „TitleFinder“: iš „HandlerBase“ išvestas „DocumentHandler“, kuris spausdina TITLES

Copyright lt.verticalshadows.com 2024

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