Programmēšana

XML programmēšana Java, 1. daļa

Tātad, jūs saprotat (vairāk vai mazāk), kā jūs attēlotu savus datus XML, un jūs interesē XML izmantošana, lai atrisinātu daudzas jūsu datu pārvaldības problēmas. Tomēr jūs nezināt, kā izmantot XML ar savām Java programmām.

TEXTBOX: TEXTBOX_HEAD: XML programmēšana Java valodā: Izlasiet visu sēriju!

  • 1. daļa. Izmantojiet vienkāršo API XML (SAX), lai viegli apstrādātu XML Java
  • 2. daļa. Uzziniet par SAX un XML validāciju, izmantojot ilustratīvus piemērus
  • 3. daļa. Dominēšana: Strukturēto dokumentu pārņemšana ar dokumenta objekta modeli

: END_TEXTBOX

Šis raksts ir turpinājums manam ievadrakstam "XML absolūtam iesācējam", kas publicēts 1999. gada aprīļa numurā. JavaWorld (URL skatiet zemāk sadaļā Resursi). Šajā rakstā aprakstīts XML; Tagad es balstīšos uz šo aprakstu un detalizēti parādīšu, kā izveidot lietojumprogrammu, kas XML apstrādei izmanto vienkāršu Java API (SAX), vieglu un spēcīgu standarta Java API.

Šeit izmantotajā koda piemērā tiek izmantota SAX API, lai lasītu XML failu un izveidotu noderīgu objektu struktūru. Kad esat pabeidzis šo rakstu, jūs būsiet gatavs izveidot savas lietojumprogrammas, kuru pamatā ir XML.

Slinkuma tikums

Lerijs Vols, traks ģeniāls Perl (otrās lielākās programmēšanas valodas, kas pastāv) radītājs, ir paziņojis, ka slinkums ir viens no programmētāja "trim lielajiem tikumiem" (pārējie divi ir nepacietība un hubris). Slinkums ir tikums, jo slinks programmētājs pieliks gandrīz visu garumu, lai izvairītos no darba, pat līdz pat vispārīgu, atkārtoti lietojamu programmēšanas ietvaru izveidošanai, kurus var izmantot atkārtoti. Šādu ietvaru izveide prasa daudz darba, taču laiks, kas tiek ietaupīts nākotnes uzdevumu veikšanai, ir vairāk nekā sākotnējais ieguldītais darbs. Labākie ietvari ļauj programmētājiem paveikt pārsteidzošas lietas ar mazu darbu vai bez tā - un tāpēc slinkums ir tikumīgs.

XML ir labvēlīga tehnoloģija tikumīgam (slinks) programmētājam. Pamata XML parsētājs programmētājam veic lielu darbu, atpazīstot marķierus, tulkojot kodētas rakstzīmes, ieviešot noteikumus par XML failu struktūru, pārbaudot dažu datu vērtību derīgumu un vajadzības gadījumā veicot zvanus uz lietojumprogrammas kodu. Faktiski agrīna standartizācija apvienojumā ar sīvu konkurenci tirgū ir devusi daudz brīvi pieejamo standarta XML parsētāju ieviešana daudzās valodās, tostarp C, C ++, Tcl, Perl, Python un, protams, Java.

SAX API ir viena no vienkāršākajām un vieglākajām saskarnēm XML apstrādei. Šajā rakstā es izmantošu IBM XML4J SAX ieviešanu, taču, tā kā API ir standartizēta, jūsu lietojumprogramma varētu aizstāt jebkuru paketi, kurā tiek ieviesta SAX.

SAX ir uz notikumiem balstīta API, kas darbojas pēc atzvanīšanas principa. Lietojumprogrammu programmētājs parasti izveidos SAX Parsētājs objektu un nodod tam gan ievades XML, gan a dokumentu apstrādātājs, kas saņem atzvanīšanu par SAX notikumiem. SAX Parsētājs pārveido savu ievadi notikumiem kas atbilst ievades strukturālajām iezīmēm, piemēram, XML tagiem vai teksta blokiem. Katra notikuma laikā tas tiek nodots atbilstošai programmētāja definēta dokumenta apstrādātāja metodei, kas ievieš atzvanīšanas saskarni org.xml.sax.DocumentHandler. Šīs apstrādātāju klases metodes analizēšanas laikā veic lietojumprogrammas funkcionalitāti.

Piemēram, iedomājieties, ka SAX parsētājs saņem dokumentu ar niecīgu XML dokumentu, kas parādīts 1. sarakstā. (Skatiet XML faila resursus.)

 Ogdenas Nešas blusas Ādamam bija. 

Saraksts 1. XML, kas attēlo īsu dzejoli

Kad SAX parsētājs sastopas ar tagu, tas izsauc lietotāja definētu DocumentHandler.startElement () ar auklu DZEJOLA kā arguments. Jūs īstenojat startElement () metode, lai veiktu visu, kas paredzēts lietojumprogrammai, kad a DZEJOLA sākas. Notikumu straume un no tā izrietošie XML fragmenta zvani tiek parādīti 1. tabulā.

1. tabula. SAX rada atzvanīšanas secību, analizējot 1. sarakstu
Radusies preceParsētāja atzvanīšana
{Dokumenta sākums}startDocument ()
startElement ("POEM", {AttributeList})
"\ n"rakstzīmes ("\ n ...", 6, 1)
startElement ("AUTHOR", {AttributeList})
"Ogden Nash"rakstzīmes ("\ n ...", 15, 10)
endElement ("AUTORS")
"\ n"rakstzīmes ("\ n ...", 34, 1)
startElement ("TITLE", {AttributeList})
"Blusas"rakstzīmes ("\ n ...", 42, 5)
endElement ("TITLE")
"\ n"rakstzīmes ("\ n ...", 55, 1)
startElement ("LINE", {AttributeList})
"Ādams"rakstzīmes ("\ n ...", 62, 4)
endElement ("LINE")
startElement ("LINE", {AttributeList})
- Bija viņi.rakstzīmes ("\ n ...", 67, 8)
endElement ("LINE")
"\ n"rakstzīmes ("\ n ...", 82, 1)
endElement ("POEM")
{Dokumenta beigas}endDocument ()

Jūs izveidojat klasi, kas īsteno DocumentHandler lai reaģētu uz notikumiem, kas notiek SAX parsatorā. Šie notikumiem nav Java notikumi, jo jūs tos zināt no Abstract Windowing Toolkit (AWT). Tie ir apstākļi, kurus SAX parsētājs atklāj, kad tie analizē, piemēram, dokumenta sākums vai aizvēršanas taga parādīšanās ievades straumē. Kad notiek katrs no šiem nosacījumiem (vai notikumiem), SAX izsauc metodi, kas atbilst nosacījumam tajā DocumentHandler.

Tātad, lai rakstītu programmas, kas apstrādā XML ar SAX, galvenais ir noskaidrot, kas ir DocumentHandler jādara, reaģējot uz SAX metožu atzvanīšanu. SAX parsētājs rūpējas par visu tagu identificēšanas, entītijas vērtību aizstāšanas un tā tālāk mehānismu, ļaujot jums koncentrēties uz lietojumprogrammas funkcionalitāti, kas izmanto XML kodētos datus.

1. tabulā ir parādīti tikai notikumi, kas saistīti ar elementiem un rakstzīmēm. SAX ietver arī iespējas apstrādāt citas XML failu strukturālās iezīmes, piemēram, entītijas un apstrādes instrukcijas, taču tās neietilpst šī raksta darbības jomā.

Nopietns lasītājs pamanīs, ka XML dokumentu var attēlot kā ierakstītu objektu koku un ka notikumu plūsmas secība tiek parādīta DocumentHandler atbilst dokumentu koku kārtīgai, dziļumam vispirms šķērsošanai. (Nav svarīgi saprast šo punktu, taču XML dokumenta kā koka datu struktūras jēdziens ir noderīgs sarežģītākos dokumentu apstrādes veidos, kas tiks aplūkoti nākamajos šīs sērijas rakstos.)

Lai saprastu, kā lietot SAX, ir jāsaprot DocumentHandler saskarni, kuru es apspriedīšu tālāk.

Pielāgojiet parsētāju ar org.xml.sax.DocumentHandler

Kopš DocumentHandler saskarne ir tik svarīga XML apstrādei ar SAX, ir vērts saprast, kādas ir saskarnē esošās metodes. Šajā sadaļā es apskatīšu būtiskākās metodes un izlaižu tās, kas nodarbojas ar progresīvākām tēmām. Atcerieties, DocumentHandler ir saskarne, tāpēc manis aprakstītās metodes ir metodes, kuras jūs ieviesīsit, lai apstrādātu lietojumprogrammas funkcionalitāti ikreiz, kad notiek attiecīgais notikums.

Dokumenta inicializēšana un tīrīšana

Katram parsētam dokumentam SAX XML parsētājs izsauc DocumentHandler saskarnes metodes startDocument () (izsaukts pirms apstrādes sākuma) un endDocument () (izsaukts pēc apstrādes pabeigšanas). Varat izmantot šīs metodes, lai inicializētu DocumentHandler sagatavot to notikumu saņemšanai un pēc parsēšanas pabeigšanas iztīrīt vai izveidot izvadi. endDocument () ir īpaši interesants, jo to izsauc tikai tad, ja ievades dokuments ir veiksmīgi parsēts. Ja Parsētājs ģenerē liktenīgu kļūdu, tā vienkārši pārtrauc notikumu straumi un pārtrauc analizēt, un endDocument () nekad netiek izsaukts.

Apstrādā tagus

SAX parsētājs izsauc startElement () ikreiz, kad tā sastopas ar atvērtu tagu, un endElement () ikreiz, kad tā sastop tuvu atzīmi. Šīs metodes bieži satur kodu, kas lielāko daļu darba veic, analizējot XML failu. startElement ()Pirmais arguments ir virkne, kas ir sastaptā elementa taga nosaukums. Otrais arguments ir tipa objekts AttributeList, saskarne, kas definēta paketē org.xml.sax kas nodrošina secīgu vai nejaušu piekļuvi elementu atribūtiem pēc nosaukuma. (Jūs neapšaubāmi jau iepriekš redzējāt atribūtus HTML; rindā

, Robežas ir atribūts, kura vērtība ir "1"). Tā kā 1. sarakstā nav atribūtu, tie netiek parādīti 1. tabulā. Atribūtu piemēri tiks parādīti lietojumprogrammas paraugā vēlāk šajā rakstā.

Tā kā SAX nesniedz nekādu informāciju par sastapto elementu kontekstu (tas ir parādās iekšpusē piemēram, 1. sarakstā), jums ir jānorāda šī informācija. Lietojumprogrammu programmētāji bieži izmanto kaudzes startElement () un endElement (), nospiežot objektus uz kaudzes, kad elements sākas, un izvelkot tos no kaudzes, kad elements beidzas.

Apstrādāt teksta blokus

The rakstzīmes () metode norāda rakstzīmju saturu XML dokumentā - rakstzīmes, kas neparādās XML tagā, citiem vārdiem sakot. Šīs metodes paraksts ir mazliet dīvains. Pirmais arguments ir baitu masīvs, otrais ir indekss šajā masīvā, kas norāda apstrādājamā diapazona pirmo rakstzīmi, un trešais arguments ir rakstzīmju diapazona garums.

Var šķist, ka vienkāršāka API būtu vienkārši nokārtojusi a Stīga objekts, kas satur datus, bet rakstzīmes () šādā veidā tika definēts efektivitātes apsvērumu dēļ. Parsētājs nespēj uzzināt, vai izmantosiet rakstzīmes, tāpēc, kad parsētājs parsē ievades buferi, tas nodod atsauci uz buferi un skatāmās virknes indeksiem, uzticoties, ka jūs izveidosiet Tavs Stīga ja vēlaties. Tas ir nedaudz vairāk darba, taču tas ļauj jums izlemt, vai uzlikt papildu izmaksas Stīga satura gabalu uzbūve XML failā.

The rakstzīmes () metode apstrādā gan parasto teksta saturu, gan saturu CDATA sadaļās, kas tiek izmantoti, lai novērstu burtiskā teksta bloku parsēšanu ar XML parsētāju.

Citas metodes

Programmā ir trīs citas metodes DocumentHandler interfeiss: ignorableWhitepace (), apstrādeInstrukcija (), un setDocumentLocator (). ignorableWhitepace () ziņo par atstarpes gadījumiem, un to parasti neizmanto, neapstiprinot SAX parsētājus (piemēram, tos, kurus izmantojam šim rakstam); apstrādeInstrukcija () tiek galā ar lielāko daļu lietu un ?> norobežotāji; un setDocumentLocator () var pēc izvēles ieviest SAX parsētāji, lai nodrošinātu piekļuvi SAX notikumu atrašanās vietām sākotnējā ievades straumē. Jūs varat iepazīties ar šīm metodēm, sekojot saitēm uz resursu SAX saskarnēm.

Visu metožu ieviešana saskarnē var būt garlaicīga, ja jūs interesē tikai viena vai divu no viņiem uzvedība. SAX paketē ietilpst klase ar nosaukumu HandlerBase tas būtībā neko nedara, bet var palīdzēt izmantot tikai vienu vai divas no šīm metodēm. Apskatīsim šo klasi sīkāk.

HandlerBase: Neko nedarīšanas klase

Bieži vien jūs interesē tikai vienas vai divu metožu ieviešana saskarnē un vēlaties, lai citas metodes vienkārši nedarītu neko. Klase org.xml.sax.HandlerBase vienkāršo programmas ieviešanu DocumentHandler interfeisu, ieviešot visas saskarnes metodes ar ķermeņiem, kas nedara neko. Tad tā vietā, lai īstenotu DocumentHandler, varat apakšklasē HandlerBase, un ignorēt tikai jūs interesējošās metodes.

Piemēram, pieņemsim, ka vēlaties uzrakstīt programmu, kas tikko izdrukāja jebkura XML formāta dzejoļa nosaukumu (piemēram, TitleFinder 1. sarakstā). Jūs varētu definēt jaunu DocumentHandler, tāpat kā zemāk esošajā 2. sarakstā, šī apakšklase HandlerBase, un ignorē tikai jums nepieciešamās metodes. (Skatiet resursus HTML failam ar TitleFinder.)

012 / ** 013 * SAX DocumentHandler klase, kas izdrukā ievades dokumenta 014 * elementa "TITLE" saturu. 015 * / 016 public class TitleFinder paplašina HandlerBase {017 boolean _isTitle = false; 018 public TitleFinder () {019 super (); 020} 021 / ** 022 * Izdrukājiet tekstu, kas atrodams a  elements. 023 * / 024 publiskas tukšas rakstzīmes (char [] rakstzīmes, int iStart, int iLen) {025 if (_isTitle) {026 String sTitle = jauna virkne (rakstzīmes, iStart, iLen); 027 System.out.println ("Nosaukums:" + sTitle); 028} 029} 030 / ** 031 * Atzīmēt virsraksta elementa beigas. 032 * / 033 public void endElement (virknes elements) {034 if (element.equals ("TITLE")) {035 _isTitle = false; 036} 037} 038 / ** 039 * Atrast virsrakstu saturu 040 * / 041 public static void main (String args []) {042 TitleFinder titleFinder = new TitleFinder (); 043 izmēģiniet {044 Parser parser = ParserFactory.makeParser ("com.ibm.xml.parsers.SAXParser"); 045 parser.setDocumentHandler (titleFinder); 046 parser.parse (jauns InputSource (args [0])); 047} nozveja (izņēmums ex) {048; // Labi, tāpēc dažreiz slinkums * nav tikums. 049} 050} 051 / ** 052 * Atzīmēt nosaukuma elementa sākumu 053 * / 054 public void startElement (String elements, AtribūtuList attrlist) {055 if (elements.equals ("TITLE")) {056 _isTitle = true; 057} 058} 

Saraksts 2. TitleFinder: no HandlerBase atvasināts DocumentHandler, kas izdrukā TITLEs

Copyright lv.verticalshadows.com 2024

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