Programiranje

Programiranje XML v Javi, 1. del

Torej razumete (bolj ali manj), kako bi predstavljali svoje podatke v XML, in vas zanima uporaba XML za reševanje številnih težav z upravljanjem podatkov. Vendar niste prepričani, kako uporabljati XML s svojimi programi Java.

TEXTBOX: TEXTBOX_HEAD: Programiranje XML v Javi: preberite celotno serijo!

  • Del 1. Za enostavno obdelavo XML v Javi uporabite preprost API za XML (SAX)
  • Del 2. S pomočjo ilustrativnih primerov spoznajte preverjanje veljavnosti SAX in XML
  • 3. del DOMinacija: prevzemite nadzor nad strukturiranimi dokumenti z objektnim modelom dokumentov

: END_TEXTBOX

Ta članek je nadaljevanje mojega uvodnega članka "XML za absolutnega začetnika", objavljenega aprila 1999 v JavaWorld (za URL glejte spodnji razdelek Viri). V tem članku je opisan XML; Zdaj bom nadaljeval s tem opisom in podrobno prikazal, kako ustvariti aplikacijo, ki uporablja Simple API for Java (SAX), lahek in zmogljiv standardni Java API za obdelavo XML.

Primer tukaj uporabljene kode uporablja API SAX za branje datoteke XML in ustvarjanje uporabne strukture predmetov. Ko končate ta članek, boste pripravljeni na ustvarjanje lastnih aplikacij, ki temeljijo na XML.

Krepost lenobe

Larry Wall, nori genialni ustvarjalec Perla (drugega največjega obstoječega programskega jezika), je izjavil, da je lenoba ena od "treh velikih vrlin" programerja (drugi dve sta nestrpnost in ponižanje). Lenoba je vrlina, saj se bo leni programer izognil delu skorajda v dolžino, celo tako daleč, da bo ustvaril splošne programske okvire za večkratno uporabo, ki jih je mogoče večkrat uporabiti. Ustvarjanje takšnih okvirov zahteva veliko dela, vendar čas, prihranjen pri prihodnjih nalogah, več kot nadomesti začetni vloženi trud. Najboljši okviri omogočajo programerjem, da delajo neverjetne stvari z malo ali nič dela - in zato je lenoba krepostna.

XML je tehnologija, ki omogoča vrlemu (lenu) programerju. Osnovni razčlenjevalnik XML opravi veliko dela za programerja, prepozna žetone, prevede kodirane znake, uveljavi pravila o datotečni strukturi XML, preveri veljavnost nekaterih podatkovnih vrednosti in po potrebi pokliče kodo, specifično za aplikacijo. Dejansko je zgodnja standardizacija v kombinaciji z močno konkurenčnim trgom ustvarila številne rezultate prosto razpoložljive izvedbe standardnih razčlenjevalnikov XML v mnogih jezikih, vključno s C, C ++, Tcl, Perl, Python in, seveda, Javo.

API SAX je eden najpreprostejših in najlažjih vmesnikov za obdelavo XML. V tem članku bom uporabil IBM-ovo izvedbo XML4J SAX, ker pa je API standardiziran, lahko vaša aplikacija nadomesti kateri koli paket, ki izvaja SAX.

SAX je API, ki temelji na dogodkih in deluje na principu povratnega klica. Programer programov običajno ustvari SAX Razčlenjevalnik objekt in mu posredujte vhodni XML in a urejevalnik dokumentov, ki prejema povratne klice za dogodke SAX. SAX Razčlenjevalnik pretvori svoj vnos v tok dogodkov ki ustreza strukturnim značilnostim vnosa, kot so oznake XML ali bloki besedila. Ko se zgodi vsak dogodek, se posreduje ustrezni metodi programerja definiranega obdelovalca dokumentov, ki izvaja vmesnik povratnega klica org.xml.sax.DocumentHandler. Metode v tem razredu upravljavca med razčlenjevanjem izvajajo funkcijo, specifično za aplikacijo.

Na primer, predstavljajte si, da razčlenjevalnik SAX prejme dokument, ki vsebuje majhen dokument XML, prikazan v spodnjem seznamu 1. (Glejte Vire za datoteko XML.)

 Ogden Nash Fleas Adam Had 'em. 

Seznam 1. XML, ki predstavlja kratko pesem

Ko razčlenjevalnik SAX naleti na tag, pokliče uporabniško določen DocumentHandler.startElement () z vrvico PESEM kot argument. Izvajate startElement () način, da naredite vse, kar naj bi aplikacija storila, ko a PESEM začne. Tok dogodkov in posledični klici za del XML zgoraj so prikazani v spodnji tabeli 1.

Tabela 1. Zaporedje povratnih klicev, ki jih SAX ustvari med razčlenjevanjem seznama 1
Našel je elementPovratni klic razčlenjevalnika
{Začetek dokumenta}startDocument ()
startElement ("POEM", {AttributeList})
"\ n"znakov ("\ n ...", 6, 1)
startElement ("AVTOR", {AttributeList})
"Ogden Nash"znakov ("\ n ...", 15, 10)
endElement ("AVTOR")
"\ n"znakov ("\ n ...", 34, 1)
startElement ("TITLE", {AttributeList})
"Bolhe"znakov ("\ n ...", 42, 5)
endElement ("TITLE")
"\ n"znakov ("\ n ...", 55, 1)
startElement ("LINE", {AttributeList})
"Adam"znakov ("\ n ...", 62, 4)
endElement ("LINE")
startElement ("LINE", {AttributeList})
"Sem jih imel."znakov ("\ n ...", 67, 8)
endElement ("LINE")
"\ n"znakov ("\ n ...", 82, 1)
endElement ("POEM")
{Konec dokumenta}endDocument ()

Ustvarite razred, ki izvaja DocumentHandler za odziv na dogodke, ki se pojavijo v razčlenjevalniku SAX. Te dogodkov niso dogodki Java, kot jih morda poznate iz zbirke orodij za abstraktno okno (AWT). To so pogoji, ki jih razčlenjevalnik SAX zazna med razčlenjevanjem, na primer začetek dokumenta ali pojav zaključne oznake v vhodnem toku. Ko pride do vsakega od teh pogojev (ali dogodkov), SAX pokliče metodo, ki ustreza pogoju v njem DocumentHandler.

Ključno za pisanje programov, ki obdelujejo XML s SAX, je ugotoviti, kaj je DocumentHandler bi se moral odzvati na tok povratnih klicev metode iz SAX. Razčlenjevalnik SAX skrbi za vso mehaniko prepoznavanja oznak, nadomeščanja vrednosti entitet itd., Tako da se lahko osredotočite na funkcionalnost, specifično za aplikacijo, ki uporablja podatke, kodirane v XML.

Tabela 1 prikazuje samo dogodke, povezane z elementi in znaki. SAX vključuje tudi zmogljivosti za obdelavo drugih strukturnih značilnosti datotek XML, kot so entitete in navodila za obdelavo, vendar te ne spadajo v področje uporabe tega članka.

Previdni bralec bo opazil, da je dokument XML mogoče predstaviti kot drevo vtipkanih predmetov in da vrstni red toka dogodkov, predstavljenih DocumentHandler ustreza vrstnemu redu, najprej po globini, prečkanja drevesa dokumentov. (Te točke ni bistveno razumeti, vendar je koncept dokumenta XML kot drevesna struktura podatkov uporaben pri bolj dovršenih vrstah obdelave dokumentov, ki bodo obravnavane v naslednjih člankih te serije.)

Ključ do razumevanja, kako uporabljati SAX, je razumevanje DocumentHandler vmesnik, o katerem bom razpravljal naprej.

Prilagodite razčlenjevalnik z org.xml.sax.DocumentHandler

Ker je DocumentHandler vmesnik je tako osrednjega pomena za obdelavo XML s SAX, da je vredno razumeti, kaj naredijo metode v vmesniku. V tem poglavju bom zajel bistvene metode in preskočil tiste, ki se ukvarjajo z naprednejšimi temami. Ne pozabite, DocumentHandler je vmesnik, zato so metode, ki jih opisujem, metode, ki jih boste uporabili za obdelavo funkcionalnosti, specifične za aplikacijo, kadar koli se zgodi ustrezen dogodek.

Inicializacija in čiščenje dokumentov

Za vsak razčlenjen dokument razčlenjevalnik SAX XML pokliče DocumentHandler vmesniške metode startDocument () (poklican pred začetkom obdelave) in endDocument () (poklicano po končani obdelavi). Te metode lahko uporabite za inicializacijo DocumentHandler za pripravo na sprejemanje dogodkov in za čiščenje ali ustvarjanje rezultatov po končanem razčlenjevanju. endDocument () je še posebej zanimiv, saj se pokliče le, če je bil vhodni dokument uspešno razčlenjen. Če je Razčlenjevalnik ustvari usodno napako, preprosto prekine tok dogodkov in ustavi razčlenjevanje in endDocument () se nikoli ne pokliče.

Obdelava oznak

Pokliče razčlenjevalnik SAX startElement () kadar koli naleti na odprto oznako, in endElement () vsakič, ko naleti na tesno oznako. Te metode pogosto vsebujejo kodo, ki opravi večino dela med razčlenjevanjem datoteke XML. startElement ()Prvi argument je niz, ki je ime oznake elementa, ki smo ga našli. Drugi argument je objekt tipa AttributeList, vmesnik, definiran v paketu org.xml.sax ki omogoča zaporedni ali naključni dostop do atributov elementov po imenu. (Atribute ste nedvomno že videli v HTML-ju; v vrstici

, MEJA je atribut, katerega vrednost je "1"). Ker seznam 1 ne vsebuje nobenih atributov, se ne pojavijo v tabeli 1. Primeri atributov boste v vzorčni aplikaciji videli kasneje v tem članku.

Ker SAX ne zagotavlja nobenih informacij o kontekstu elementov, s katerimi se srečuje (to se pojavi v notranjosti na primer v zgornjem seznamu 1), morate navesti te podatke. Programerji aplikacij pogosto uporabljajo sklade startElement () in endElement (), potiskanje predmetov na sklad, ko se element začne, in izpuščanje iz sklada, ko se element konča.

Obdelajte bloke besedila

The znakov () metoda označuje vsebino znakov v dokumentu XML - z drugimi besedami, znaki, ki se ne prikažejo znotraj oznake XML. Podpis te metode je nekoliko čuden. Prvi argument je niz bajtov, drugi je indeks te matrike, ki označuje prvi znak obsega, ki ga je treba obdelati, tretji argument pa je dolžina obsega znakov.

Morda se zdi, da bi lažji API preprosto prenesel datoteko Vrvica predmet, ki vsebuje podatke, vendar znakov () je bila zaradi učinkovitosti opredeljena na ta način. Razčlenjevalnik nikakor ne more vedeti, ali boste uporabili znake ali ne, tako da razčlenjevalnik vhodnega vmesnega pomnilnika posreduje sklic na vmesnik in indekse niza, ki si ga ogleduje, zaupajoč, da boste sestavili lastne Vrvica če ga želite. To je nekoliko več dela, vendar vam omogoča, da se odločite, ali boste porabili ali ne Vrvica konstrukcija vsebinskih kosov v datoteki XML.

The znakov () metoda obravnava tako navadno besedilno vsebino kot vsebino znotraj odsekov CDATA, ki se uporabljajo za preprečevanje razčlenjevanja blokov dobesednega besedila z razčlenjevalnikom XML.

Druge metode

Obstajajo tri druge metode v DocumentHandler vmesnik: ignorableWhitespace (), navodila za obdelavo (), in setDocumentLocator (). ignorableWhitespace () poroča o pojavih praznine in je običajno neuporabljen v neveljavnih razčlenjevalcih SAX (na primer tistem, ki ga uporabljamo za ta članek); navodila za obdelavo () obravnava večino stvari znotraj in ?> ločila; in setDocumentLocator () po izbiri izvajajo razčlenjevalniki SAX, ki vam omogočajo dostop do lokacij dogodkov SAX v prvotnem vhodnem toku. Te metode lahko preberete tako, da sledite povezavam na vmesnikih SAX v virih.

Izvajanje vseh metod v vmesniku je lahko dolgočasno, če vas zanima samo vedenje enega ali dveh. Paket SAX vključuje razred z imenom HandlerBase ki v bistvu ne naredi ničesar, lahko pa vam pomaga izkoristiti le eno ali dve od teh metod. Podrobneje preučimo ta razred.

HandlerBase: razred ničesar

Pogosto vas zanima samo ena ali dve metodi v vmesniku in želite, da druge metode preprosto ne naredijo ničesar. Razred org.xml.sax.HandlerBase poenostavlja izvajanje DocumentHandler vmesnika z izvajanjem vseh metod vmesnika s telesi, ki ne naredijo ničesar. Nato namesto izvajanja DocumentHandler, lahko podrazred HandlerBasein preglasite samo metode, ki vas zanimajo.

Recimo na primer, da ste želeli napisati program, ki je ravno natisnil naslov katere koli pesmi v obliki zapisa XML (na primer TitleFinder v seznamu 1). Lahko bi definirali novo DocumentHandler, kot je ta v spodnjem seznamu 2, ta podrazred HandlerBasein preglasi samo metode, ki jih potrebujete. (Glejte Viri za datoteko HTML v TitleFinder.)

012 / ** 013 * Razred SAX DocumentHandler, ki natisne vsebino elementa "TITLE" 014 * vhodnega dokumenta. 015 * / 016 javni razred TitleFinder razširja HandlerBase {017 boolean _isTitle = false; 018 public TitleFinder () {019 super (); 020} 021 / ** 022 * Natisnite besedilo, ki ga najdete v  element. 023 * / 024 javni void znaki (char [] znaki, int iStart, int iLen) {025 if (_isTitle) {026 String sTitle = nov niz (znaki, iStart, iLen); 027 System.out.println ("Naslov:" + sTitle); 028} 029} 030 / ** 031 * Označi konec naslovnega elementa. 032 * / 033 public void endElement (element niza) {034 if (element.equals ("TITLE")) {035 _isTitle = false; 036} 037} 038 / ** 039 * Poiščite vsebino naslovov 040 * / 041 public static void main (String args []) {042 TitleFinder titleFinder = new TitleFinder (); 043 poskusite {044 Parser parser = ParserFactory.makeParser ("com.ibm.xml.parsers.SAXParser"); 045 parser.setDocumentHandler (titleFinder); 046 parser.parse (nov InputSource (args [0])); 047} ulov (izjema ex) {048; // V redu, zato včasih lenoba * ni * vrlina. 049} 050} 051 / ** 052 * Označi naslovni element 053 * / 054 public void startElement (element niza, AttributeList attrlist) {055 if (element.equals ("TITLE")) {056 _isTitle = true; 057} 058} 

Seznam 2. TitleFinder: DocumentHandler, izpeljan iz HandlerBase, ki natisne NASLOVE

Copyright sl.verticalshadows.com 2024

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