Programovanie

Programovanie XML v prostredí Java, 1. časť

Takže rozumiete (viac alebo menej) tomu, ako by ste reprezentovali svoje údaje v XML, a máte záujem o použitie XML na vyriešenie mnohých vašich problémov so správou údajov. Napriek tomu si nie ste istí, ako používať XML so svojimi programami Java.

TEXTBOX: TEXTBOX_HEAD: Programovanie XML v Jave: Prečítajte si celú sériu!

  • Časť 1. Použite Simple API for XML (SAX) na ľahké spracovanie XML v Jave
  • Časť 2. Dozviete sa viac o validácii SAX a XML na názorných príkladoch
  • Časť 3. DOMINÁCIA: Ovládnite štruktúrované dokumenty pomocou Objektového modelu dokumentu

: END_TEXTBOX

Tento článok nadväzuje na môj úvodný článok „XML pre absolútneho začiatočníka“ v vydaní publikácie z apríla 1999 JavaWorld (URL nájdete v sekcii Zdroje nižšie). Tento článok popisoval XML; Teraz na tomto opise nadviažem a podrobne ukážem, ako vytvoriť aplikáciu, ktorá používa Simple API for Java (SAX), ľahké a výkonné štandardné Java API na spracovanie XML.

Vzorový kód, ktorý sa tu používa, používa rozhranie SAX API na načítanie súboru XML a vytvorenie užitočnej štruktúry objektov. V čase, keď dokončíte tento článok, budete pripravení na vytváranie vlastných aplikácií založených na XML.

Cnosť lenivosti

Larry Wall, šialený tvorca Perlu (druhého najväčšieho programovacieho jazyka v existencii), uviedol, že lenivosť je jednou z „troch veľkých cností“ programátora (ďalšie dve sú netrpezlivosť a arogancia). Lenivosť je cnosť, pretože lenivý programátor pôjde takmer na akúkoľvek dĺžku, aby sa vyhol práci, dokonca až po vytvorenie všeobecných, opakovane použiteľných programovacích rámcov, ktoré je možné opakovane používať. Vytvorenie takýchto rámcov si vyžaduje veľa práce, ale čas ušetrený pri budúcich úlohách viac ako vynahradí počiatočné investované úsilie. Najlepšie rámce umožňujú programátorom robiť úžasné veci s malou alebo žiadnou prácou - a preto je lenivosť cnostná.

XML je podporná technológia pre cnostného (lenivého) programátora. Základný syntaktický analyzátor XML odvádza pre programátora veľkú prácu, rozpoznáva tokeny, prekladá kódované znaky, presadzuje pravidlá týkajúce sa štruktúry súborov XML, kontroluje platnosť niektorých dátových hodnôt a v prípade potreby telefonuje s kódom pre konkrétnu aplikáciu. V skutočnosti včasná štandardizácia v kombinácii s tvrdo konkurenčným trhom priniesla skóre slobodne dostupné implementácie štandardných analyzátorov XML v mnohých jazykoch vrátane C, C ++, Tcl, Perl, Python a samozrejme Java.

SAX API je jedno z najjednoduchších a najľahších rozhraní pre prácu s XML. V tomto článku použijem implementáciu SAX spoločnosti XML4J od IBM, ale keďže je API štandardizované, mohla by vaša aplikácia nahradiť akýkoľvek balík, ktorý implementuje SAX.

SAX je API založené na udalostiach, pracujúce na princípe spätného volania. Programátor aplikácií zvyčajne vytvorí SAX Analyzátor objekt a odovzdajte mu vstupné XML aj a obsluha dokumentov, ktorý prijíma spätné volania pre udalosti SAX. SAX Analyzátor prevádza svoj vstup na prúd diania zodpovedajú štrukturálnym vlastnostiam vstupu, ako sú tagy XML alebo bloky textu. Keď sa vyskytne každá udalosť, odovzdá sa príslušnej metóde programátora definovanej obslužnej rutiny dokumentov, ktorá implementuje rozhranie spätného volania org.xml.sax.DocumentHandler. Metódy v tejto triede obslužných programov vykonávajú počas syntaktickej analýzy funkčnosť špecifickú pre aplikáciu.

Napríklad si predstavte, že analyzátor SAX prijme dokument obsahujúci malý dokument XML uvedený v zozname 1 nižšie. (Pozri Zdroje pre súbor XML.)

 Blchy Ogden Nash, Adam ich mal. 

Zoznam 1. XML predstavujúci krátku báseň

Keď analyzátor SAX narazí na tag, volá sa užívateľom definovaný DocumentHandler.startElement () so šnúrkou Báseň ako argument. Implementujete startElement () metóda na vykonanie všetkého, čo je zamýšľané, keď a Báseň začína. Prúd udalostí a výsledné volania pre časť XML vyššie sa nachádzajú v tabuľke 1 nižšie.

Tabuľka 1. Poradie spätných volaní, ktoré vytvára SAX pri analýze výpisu 1
Položka sa vyskytlaAnalyzátor spätné volanie
{Začiatok dokumentu}startDocument ()
startElement ("POEM", {AttributeList})
„\ n“znaky ("\ n ...", 6, 1)
startElement ("AUTHOR", {AttributeList})
„Ogden Nash“znaky ("\ n ...", 15, 10)
endElement („AUTHOR“)
„\ n“znaky ("\ n ...", 34, 1)
startElement ("TITLE", {AttributeList})
"Blchy"znaky ("\ n ...", 42, 5)
endElement ("TITLE")
„\ n“znaky ("\ n ...", 55, 1)
startElement ("LINE", {AttributeList})
„Adam“znaky ("\ n ...", 62, 4)
endElement ("LINE")
startElement ("LINE", {AttributeList})
„Mal som ich.“znaky ("\ n ...", 67, 8)
endElement ("LINE")
„\ n“znaky ("\ n ...", 82, 1)
endElement ("POEM")
{Koniec dokumentu}endDocument ()

Vytvoríte triedu, ktorá sa implementuje DocumentHandler reagovať na udalosti, ktoré sa vyskytnú v analyzátore SAX. Títo diania nie sú udalosti Java, ako ich môžete poznať z príručky Abstract Windowing Toolkit (AWT). Sú to podmienky, ktoré syntaktický analyzátor SAX zistí pri analýze, napríklad začiatok dokumentu alebo výskyt záverečnej značky vo vstupnom toku. Keď nastane každá z týchto podmienok (alebo udalostí), SAX zavolá metódu zodpovedajúcu podmienke v nej DocumentHandler.

Kľúčom k písaniu programov, ktoré spracúvajú XML pomocou SAX, je teda zistiť, čo DocumentHandler by mal urobiť v reakcii na prúd spätných volaní metód zo SAX. Analyzátor SAX sa stará o všetky mechanizmy identifikácie značiek, nahrádzania hodnôt entít atď., Vďaka čomu sa môžete sústrediť na funkčnosť konkrétnej aplikácie, ktorá využíva údaje zakódované v XML.

Tabuľka 1 zobrazuje iba udalosti spojené s prvkami a znakmi. SAX tiež obsahuje zariadenia na prácu s ďalšími štrukturálnymi vlastnosťami súborov XML, ako sú entity a pokyny na spracovanie, ktoré však presahujú rámec tohto článku.

Chytrý čitateľ si všimne, že dokument XML možno predstaviť ako strom napísaných objektov a že poradie toku udalostí prezentovaných DocumentHandler zodpovedá zoradeniu stromu dokumentov v poradí, v hĺbke. (Nie je nevyhnutné tento bod chápať, ale koncept dokumentu XML ako stromovej dátovej štruktúry je užitočný pri sofistikovanejších druhoch spracovania dokumentov, ktorým sa budeme venovať v ďalších článkoch tejto série.)

Kľúčom k pochopeniu toho, ako používať SAX, je porozumenie DocumentHandler rozhranie, o ktorom budem diskutovať ďalej.

Prispôsobte analyzátor pomocou nástroja org.xml.sax.DocumentHandler

Keďže DocumentHandler rozhranie je tak ústredné pre spracovanie XML s SAX, že stojí za to pochopiť, čo robia metódy v rozhraní. V tejto časti sa budem venovať základným metódam a vynechám tie, ktoré sa zaoberajú pokročilejšími témami. Pamätaj, DocumentHandler je rozhranie, takže metódy, ktoré popisujem, sú metódy, ktoré implementujete na spracovanie funkcií špecifických pre aplikáciu vždy, keď dôjde k príslušnej udalosti.

Inicializácia a vyčistenie dokumentu

Pre každý analyzovaný dokument volá analyzátor SAX XML znak DocumentHandler metódy rozhrania startDocument () (volané pred začiatkom spracovania) a endDocument () (volané po dokončení spracovania). Tieto metódy môžete použiť na inicializáciu súboru DocumentHandler pripraviť ho na prijímanie udalostí a vyčistiť alebo vyrobiť výstup po dokončení analýzy. endDocument () je obzvlášť zaujímavý, pretože sa volá, iba ak bol vstupný dokument úspešne analyzovaný. Ak Analyzátor generuje závažnú chybu, jednoducho preruší prúd udalostí a prestane analyzovať, a endDocument () sa nikdy nevola.

Spracovanie značiek

Analyzátor SAX volá startElement () - kedykoľvek narazí na otvorenú značku, a - endElement () kedykoľvek narazí na blízku značku. Tieto metódy často obsahujú kód, ktorý robí väčšinu práce pri analýze súboru XML. startElement ()Prvým argumentom je reťazec, čo je názov značky zisteného prvku. Druhým argumentom je objekt typu AttributeList, rozhranie definované v balíku org.xml.sax ktorá poskytuje sekvenčný alebo náhodný prístup k atribútom prvkov podľa názvu. (Atribúty ste už nepochybne videli v HTML; v riadku.)

, HRANICA je atribút, ktorého hodnota je "1"). Pretože zoznam 1 neobsahuje žiadne atribúty, v tabuľke 1 sa nezobrazia. Príklady atribútov nájdete v ukážkovej aplikácii ďalej v tomto článku.

Pretože SAX neposkytuje žiadne informácie o kontexte prvkov, s ktorými sa stretáva (to objaví sa vo vnútri (napríklad v zozname 1 vyššie), je na vás, aby ste tieto informácie poskytli. Programátori aplikácií často používajú komíny v startElement () a endElement (), tlačenie objektov do stohu, keď sa prvok začína, a ich vysunutie zo stohu, keď sa prvok končí.

Spracovať bloky textu

The znakov () metóda označuje obsah znakov v dokumente XML - inými slovami znaky, ktoré sa nenachádzajú vo vnútri značky XML. Podpis tejto metódy je trochu zvláštny. Prvý argument je pole bajtov, druhý je index do tohto poľa označujúci prvý znak rozsahu, ktorý sa má spracovať, a tretím argumentom je dĺžka rozsahu znakov.

Mohlo by sa zdať, že jednoduchšie API by jednoducho prešlo a String objekt obsahujúci údaje, ale znakov () bol takto definovaný z dôvodov efektívnosti. Analyzátor nemá žiadny spôsob, ako zistiť, či budete alebo nebudete používať znaky, takže syntaktický analyzátor analyzuje svoju vstupnú vyrovnávaciu pamäť, odovzdá odkaz na vyrovnávaciu pamäť a indexy sledovaného reťazca a verí, že skonštruujete tvoj vlastný String ak chceš. Je to o niečo viac práce, ale umožňuje vám rozhodnúť sa, či to bude alebo nebude spojené String konštrukcia pre časti obsahu v súbore XML.

The znakov () metóda spracováva bežný textový obsah aj obsah vo vnútri oddielov CDATA, ktoré sa používajú na zabránenie analýze blokov literárneho textu syntaktickým analyzátorom XML.

Iné metódy

V dokumente sú tri ďalšie metódy DocumentHandler rozhranie: ignorableWhitespace (), inštrukcia na spracovanie ()a setDocumentLocator (). ignorableWhitespace () hlási výskyty bieleho priestoru a zvyčajne sa nepoužíva v nevalidujúcich analyzátoroch SAX (napríklad v tom, ktorý používame pre tento článok); inštrukcia na spracovanie () zvláda väčšinu vecí vo vnútri a ?> oddeľovače; a setDocumentLocator () je voliteľne implementovaný analyzátormi SAX, aby vám umožnil prístup k miestam udalostí SAX v pôvodnom vstupnom streame. Tieto metódy si môžete prečítať kliknutím na odkazy na rozhraniach SAX v časti Zdroje.

Implementácia všetkých metód v rozhraní môže byť zdĺhavá, ak vás zaujíma iba správanie jednej alebo dvoch z nich. Balík SAX obsahuje triedu s názvom HandlerBase to v podstate nič nerobí, ale môže vám pomôcť využiť iba jednu alebo dve z týchto metód. Pozrime sa na túto triedu podrobnejšie.

HandlerBase: Trieda nič nerobenia

Často sa zaujímate iba o implementáciu jednej alebo dvoch metód v rozhraní a chcete, aby ostatné metódy jednoducho nerobili nič. Trieda org.xml.sax.HandlerBase zjednodušuje implementáciu DocumentHandler rozhranie implementáciou všetkých metód rozhrania s orgánmi nič nerobiť. Potom namiesto implementácie DocumentHandler, môžete podtriedu HandlerBase, a iba prepísať metódy, ktoré vás zaujímajú.

Povedzme napríklad, že chcete napísať program, ktorý práve vytlačil názov akejkoľvek básne vo formáte XML (napríklad TitleFinder v zozname 1). Môžete definovať nový DocumentHandler, podobne ako v zozname 2 nižšie, tieto podtriedy HandlerBase, a iba prepíše metódy, ktoré potrebujete. (Pozri Zdroje pre súbor HTML z TitleFinder.)

012 / ** 013 * Trieda SAX DocumentHandler, ktorá vytlačí obsah prvku „TITLE“ 014 * vstupného dokumentu. 015 * / 016 verejná trieda TitleFinder rozširuje HandlerBase {017 boolean _isTitle = false; 018 public TitleFinder () {019 super (); 020} 021 / ** 022 * Vytlačte akýkoľvek text nájdený vo vnútri a  element. 023 * / 024 public void characters (char [] chars, int iStart, int iLen) {025 if (_isTitle) {026 String sTitle = new String (chars, iStart, iLen); 027 System.out.println ("Názov:" + sTitle); 028} 029} 030 / ** 031 * Označte koniec prvku názvu. 032 * / 033 public void endElement (reťazcový prvok) {034 if (element.equals ("TITLE")) {035 _isTitle = false; 036} 037} 038 / ** 039 * Nájsť obsah titulov 040 * / 041 public static void main (String args []) {042 TitleFinder titleFinder = nový TitleFinder (); 043 try {044 Parser parser = ParserFactory.makeParser ("com.ibm.xml.parsers.SAXParser"); 045 parser.setDocumentHandler (titleFinder); 046 parser.parse (nový InputSource (args [0])); 047} úlovok (výnimka okrem) {048; // Dobre, takže niekedy lenivosť * nie je * cnosť. 049} 050} 051 / ** 052 * Označiť začiatok prvku názvu 053 * / 054 public void startElement (prvok reťazca, AttributeList attrlist) {055 if (element.equals ("TITLE")) {056 _isTitle = true; 057} 058} 

Zoznam 2. TitleFinder: DocumentHandler odvodený z HandlerBase, ktorý tlačí TITLE

Copyright sk.verticalshadows.com 2024

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