Programavimas

XML susiejimas su „Java“, 1 dalis

XML yra karšta. Kadangi XML yra savęs apibūdinančių duomenų forma, ją galima naudoti koduojant turtingų duomenų modelius. Lengva suprasti XML naudingumą kaip duomenų mainų terpę tarp labai skirtingų sistemų. Duomenis galima lengvai atskleisti arba paskelbti kaip XML iš visų rūšių sistemų: senų COBOL programų, duomenų bazių, C ++ programų ir t.

TEKSTO DĖŽUTĖ:

TEXTBOX_HEAD: XML susiejimas su Java: perskaitykite visą seriją!

  • 1 dalis. Pasinaudokite SAX API, kad susietumėte XML dokumentus su „Java“ objektais
  • 2 dalis - sukurkite klasės biblioteką, kuri naudoja SAX API XML dokumentams susieti su „Java“ objektais

: END_TEXTBOX

Tačiau naudojant XML sistemoms kurti kyla du iššūkiai. Pirma, nors XML generavimas yra nesudėtinga procedūra, atvirkštinė operacija, naudojant XML duomenis iš programos, nėra. Antra, dabartines XML technologijas lengva netinkamai pritaikyti, o tai gali palikti programuotojui lėtą, atminties ištroškusią sistemą. Iš tiesų, sunkūs atminties reikalavimai ir lėtas greitis gali būti problemiškas sistemoms, kurios naudoja XML kaip pagrindinį duomenų mainų formatą.

Kai kurie standartiniai įrankiai, šiuo metu galintys dirbti su XML, yra geresni nei kiti. Visų pirma „SAX“ API turi keletą svarbių vykdymo laiko funkcijų, susijusių su našiu kodu. Šiame straipsnyje mes sukursime keletą SAX API taikymo modelių. Galėsite sukurti greitą XML – Java susiejimo kodą su minimaliu atminties pėdsaku net ir gana sudėtingoms XML struktūroms (išskyrus rekursines struktūras).

Šios serijos 2 dalyje aptarsime SAX API taikymą rekursinėms XML struktūroms, kuriose kai kurie XML elementai reiškia sąrašų sąrašus. Taip pat sukursime klasės biblioteką, kuri valdys SAX API navigacijos aspektus. Ši biblioteka supaprastina XML susiejimo kodo rašymą remiantis SAX.

Susiejimo kodas yra panašus į kodo sudarymą

Programų, naudojančių XML duomenis, rašymas yra tarsi kompiliatoriaus rašymas. Tai yra, dauguma kompiliatorių konvertuoja šaltinio kodą į vykdomą programą trimis žingsniais. Pirma, a lekseris modulis grupuoja simbolius į žodžius ar žetonus, kuriuos kompiliatorius atpažįsta - procesą, vadinamą žetonų sudarymu. Antrasis modulis, vadinamas analizatorius, analizuoja žetonų grupes, kad atpažintų teisinės kalbos konstrukcijas. Paskutinis, trečiasis modulis kodų generatorius, ima teisinės kalbos rinkinį, sukonstruoja ir sugeneruoja vykdomąjį kodą. Kartais analizavimas ir kodo generavimas yra maišomi.

Norėdami naudoti XML duomenis „Java“ programoje, turime atlikti panašų procesą. Pirmiausia analizuojame kiekvieną XML teksto simbolį, kad atpažintume legalius XML žetonus, tokius kaip pradžios žymos, atributai, pabaigos žymos ir CDATA skyriai.

Antra, mes patikriname, ar prieigos raktai sudaro teisėtus XML konstruktus. Jei XML dokumentą sudaro tik teisiniai konstruktai pagal XML 1.0 specifikaciją, tai yra gerai suformuotas. Pagrindiniu lygmeniu turime įsitikinti, kad, pavyzdžiui, visas žymėjimas turi atitinkančias pradžios ir pabaigos žymas, o atributai yra tinkamai struktūrizuoti atidarymo žymoje.

Be to, jei yra DTD, turime galimybę įsitikinti, kad analizuojant rasti XML konstruktai yra teisėti DTD požiūriu, taip pat yra gerai suformuoti XML.

Galiausiai mes naudojame duomenis, esančius XML dokumente, siekdami kažko naudingo - aš vadinu šį susiejimo XML į „Java“.

XML analizatoriai

Laimei, yra tam tikrų komponentų - XML ​​analizatorių -, kurie mums atlieka šias su kompiliatoriumi susijusias užduotis. XML analizatoriai atlieka visas leksinės analizės ir analizės užduotis. Daugelis šiuo metu turimų „Java“ pagrindu sukurtų XML analizatorių palaiko du populiarius analizės standartus: SAX ir DOM API.

Galimybė įsigyti parduodamą XML analizatorių gali atrodyti, kad sunkiausia XML naudojimo „Java“ srityje buvo atlikta už jus. Tikrai reikalinga užduotis, kai reikia įsigyti paruoštą XML analizatorių.

SAX ir DOM API

SAX API yra pagrįsta įvykiais. XML analizatoriai, įgyvendinantys SAX API, generuoja įvykius, atitinkančius skirtingas ypatybes, esančias išanalizuotame XML dokumente. Atsakydami į šį „SAX“ įvykių srautą „Java“ kode, galite rašyti programas, pagrįstas XML duomenimis.

DOM API yra objektu modeliu paremta API. XML analizatoriai, diegiantys DOM, atmintyje sukuria bendrą objektų modelį, kuris atspindi XML dokumento turinį. Kai XML analizatorius baigs analizuoti, atmintyje yra DOM objektų medis, kuriame pateikiama informacija apie XML dokumento struktūrą ir turinį.

DOM koncepcija išaugo iš HTML naršyklės pasaulio, kur bendras dokumento objekto modelis atspindi naršyklėje įkeltą HTML dokumentą. Tada šis HTML DOM tampa prieinamas scenarijų kalboms, tokioms kaip „JavaScript“. HTML DOM šioje programoje buvo labai sėkmingas.

DOM pavojai

Iš pirmo žvilgsnio atrodo, kad DOM API yra turtingesnė funkcijomis ir todėl geresnė nei SAX API. Tačiau DOM turi rimtų efektyvumo problemų, kurios gali pakenkti našumui jautrioms programoms.

Dabartinė DML palaikančių XML analizatorių grupė įgyvendina atmintyje esančių objektų modelį, sukurdama daug mažų objektų, kurie vaizduoja DOM mazgus, kuriuose yra arba tekstas, arba kiti DOM mazgai. Tai skamba pakankamai natūraliai, tačiau turi neigiamų rezultatų. Viena iš brangiausių operacijų „Java“ yra naujas operatorius. Atitinkamai kiekvienam naujas operatorius, vykdomas „Java“, JVM šiukšlių surinkėjas galiausiai turi pašalinti objektą iš atminties, kai nelieka nuorodų į objektą. DOM API linkusi iš tikrųjų mesti JVM atminties sistemą su daugybe mažų objektų, kurie paprastai yra išmesti netrukus po analizavimo.

Kita DOM problema yra tai, kad jis įkelia visą XML dokumentą į atmintį. Dideliems dokumentams tai tampa problema. Vėlgi, kadangi DOM įdiegta tiek daug mažų objektų, atminties pėdsakas yra dar didesnis nei pats XML dokumentas, nes JVM saugo kelis papildomus informacijos apie visus šiuos objektus, taip pat XML dokumento turinį, baitus.

Nerimą kelia ir tai, kad daugelis „Java“ programų iš tikrųjų nenaudoja bendros DOM objektų struktūros. Vietoj to, kai tik DOM struktūra įsikrauna į atmintį, jie nukopijuoja duomenis į objekto modelį, būdingą konkrečiai probleminei sričiai - subtilų, bet švaistantį procesą.

Dar viena subtili DOM API problema yra ta, kad jai parašytas kodas turi du kartus nuskaityti XML dokumentą. Pirmasis leidimas sukuria DOM struktūrą atmintyje, antrasis suranda visus XML duomenis, kuriais domisi programa. Tam tikri kodavimo stiliai gali kelis kartus peržengti DOM struktūrą, tuo pat metu ieškodami skirtingų XML duomenų dalių. Priešingai, SAX kodavimo stilius skatina rasti ir rinkti XML duomenis vienu leidimu.

Kai kurios iš šių problemų galėtų būti išspręstos su geresniu duomenų struktūros dizainu, kad viduje būtų atstovaujama DOM objekto modeliui. XML analizatoriuose negalima išspręsti tokių problemų kaip kelių apdorojimo leidimų skatinimas ir vertimas iš bendrojo ir konkretaus objekto modelių.

SAX išgyvenimui

Palyginti su DOM API, SAX API yra patrauklus būdas. SAX neturi bendro objekto modelio, todėl neturi atminties ar našumo problemų, susijusių su piktnaudžiavimu naujas operatorius. Ir naudojant „SAX“ nėra jokio bendro objekto modelio, kurio nepaisytumėte, jei vietoj to planuojate naudoti konkretų problemos domeno objekto modelį. Be to, kadangi SAX XML dokumentą apdoroja vienu leidimu, jam reikia daug mažiau apdorojimo laiko.

SAX tikrai turi keletą trūkumų, tačiau jie dažniausiai yra susiję su programuotoju, o ne su API vykdymu vykdymo metu. Pažvelkime į keletą.

Pirmasis trūkumas yra konceptualus. Programuotojai yra įpratę naršyti norėdami gauti duomenų; Norėdami rasti failą failų serveryje, naršykite keisdami katalogus. Panašiai, norėdami gauti duomenų iš duomenų bazės, jums reikia SQL duomenų užklausos. Naudojant SAX, šis modelis yra apverstas. Tai yra, jūs nustatote kodą, kuris klauso visų galimų XML duomenų dalių sąrašo. Tas kodas suaktyvinamas tik tada, kai pateikiami įdomūs XML duomenys. Iš pradžių atrodo, kad SAX API yra keista, tačiau po kurio laiko mąstymas tokiu apverstu būdu tampa antruoju pobūdžiu.

Antrasis trūkumas yra pavojingesnis. Naudojant SAX kodą, naivus metodas „įsilaužkime į jį“ gana greitai atsilieps, nes SAX analizatorius išsamiai naršo XML struktūrą, tuo pačiu metu pateikdamas XML dokumente saugomus duomenis. Daugelis žmonių sutelkia dėmesį į duomenų kartografavimo aspektą ir nepaiso navigacijos aspekto. Jei tiesiogiai nesprendžiate navigacijos SAX analizavimo aspekto, kodas, kuris stebi vietą XML struktūroje SAX analizavimo metu, bus išplitęs ir turės daug subtilių sąveikų. Ši problema yra panaši į tas, kurios susijusios su perdėta priklausomybe nuo pasaulinių kintamųjų. Bet jei jūs išmoksite tinkamai susisteminti SAX kodą, kad jis netaptų nepatogus, tai yra paprasčiau nei naudoti DOM API.

Pagrindinis SAX

Šiuo metu yra dvi paskelbtos SAX API versijos. Savo pavyzdžiams naudosime 2 versiją (žr. Ištekliai). 2 versijoje naudojami skirtingi klasių ir metodų pavadinimai nei 1 versijoje, tačiau kodo struktūra yra ta pati.

SAX yra API, o ne analizatorius, todėl šis kodas yra bendras XML analizatoriuose. Norėdami paleisti pavyzdžius, turėsite pasiekti XML analizatorių, palaikantį SAX v2. Aš naudoju „Apache“ „Xerces“ analizatorių. (Žr. Šaltinius.) Peržiūrėkite savo analizatoriaus darbo pradžios vadovą, kuriame rasite specifikos, kaip iškviesti SAX analizatorių.

SAX API specifikacija yra gana paprasta. „In“ apima daugybę detalių, tačiau pagrindinė jo užduotis yra sukurti klasę, kuri įgyvendintų „ContentHandler“ sąsaja, XML analizatorių naudojama sąsaja, skirta pranešti jūsų programai apie SAX įvykius, kaip jie yra XML dokumente.

SAX API taip pat patogiai teikia a DefaultHandler diegimo klasė „ContentHandler“ sąsaja.

Įdiegę „ContentHandler“ arba pratęsė DefaultHandler, norint nukreipti konkretų dokumentą, reikia nukreipti tik XML analizatorių.

Pirmasis mūsų pavyzdys pratęsia DefaultHandler spausdinti kiekvieną SAX įvykį konsolėje. Tai leis jums pajusti, kokie SAX įvykiai bus generuojami ir kokia tvarka.

Norėdami pradėti, pateikite XML dokumento pavyzdį, kurį naudosime pirmajame pavyzdyje:

   Bobas Niujorkas 

Tada pamatysime pirmojo pavyzdžio XML susiejimo kodo šaltinio kodą:

importuoti org.xml.sax. *; importuoti org.xml.sax.helpers. *; importuoti java.io. *; viešoji klasė1 pavyzdys išplečia „DefaultHandler“ {// Nepaisyti „DefaultHandler“ klasės // metodų, kad gautumėte pranešimą apie „SAX“ įvykius. // // Visus galimus įvykius žr. Org.xml.sax.ContentHandler. // public void startDocument () meta SAXException {System.out.println ("SAX įvykis: PADEDIMO DOKUMENTAS"); } public void endDocument () išmeta SAXException {System.out.println ("SAX įvykis: PABAIGOS DOKUMENTAS"); } public void startElement (String namespaceURI, String localName, String qName, Attributes attr) meta SAXException {System.out.println ("SAX įvykis: START ELEMENTAS [" + vietinisVardas + "]"); // Be to, atspausdinkime atributus, jei // yra ... for (int i = 0; i <attr.getLength (); i ++) {System.out.println ("ATTRIBUTE:" + attr.getLocalName ( i) + "VALUE:" + attr.getValue (i)); }} public void endElement (String namespaceURI, String localName, String qName) išmeta SAXException {System.out.println ("SAX įvykis: END ELEMENT [" + localName + "]"); } public void simboliai (char [] ch, int start, int length) išmeta SAXException {System.out.print ("SAX įvykis: CHARAKTERIAI ["); pabandykite {OutputStreamWriter outw = new OutputStreamWriter (System.out); outw.write (ch, pradžia, ilgis); outw.flush (); } gaudyti (e išimtis) {e.printStackTrace (); } System.out.println ("]"); } public static void main (String [] argv) {System.out.println ("1 pavyzdys SAX įvykių:"); pabandykite {// Sukurti SAX 2 analizatorių ... XMLReader xr = XMLReaderFactory.createXMLReader (); // Nustatykite „ContentHandler“ ... xr.setContentHandler (naujas1 pavyzdys ()); // Analizuoti failą ... xr.parse (new InputSource (new FileReader ("Example1.xml"))); } sugavimas (e išimtis) {e.printStackTrace (); }}} 

Galiausiai, čia yra išvestis, sukurta vykdant pirmąjį pavyzdį su mūsų pavyzdiniu XML dokumentu:

1 pavyzdys SAX įvykiai: SAX įvykis: START DOCUMENT SAX įvykis: START ELEMENT [paprastas] ATTRIBUTE: data VALUE: 2000 7 7 SAX įvykis: CHARACTERS [] SAX įvykis: START ELEMENT [vardas] SAX įvykis: CHARACTERS [Bob] SAX įvykis : END ELEMENT [vardas] SAX įvykis: CHARACTERS [] SAX įvykis: START ELEMENT [vieta] SAX įvykis: CHARACTERS [Niujorkas] SAX įvykis: END ELEMENT [vieta] SAX įvykis: CHARACTERS [] SAX įvykis: END ELEMENT [paprastas] SAX renginys: PABAIGOS DOKUMENTAS 

Kaip matote, SAX analizatorius iškvies atitinkamą „ContentHandler“ metodas kiekvienam SAX įvykiui, kurį jis atranda XML dokumente.

Labas pasauli

Dabar, kai suprantame pagrindinį „SAX“ modelį, galime pradėti daryti šiek tiek naudingą dalyką: išgauti reikšmes iš savo paprasto XML dokumento ir parodyti klasikinę „labo pasaulio“ programą.

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