XML členitelji
Med tri-črkovnimi kraticami je verjetno med bolj znanimi v programerskih vodah - XML (Extensible Markup Language). Ima burno zgodovino in mislim, da se prah okoli te kratice le polagoma poseda. Koliko zvenečih besed je bilo izrečenih in nekaj prav gotovo utemeljeno. No, izkazalo se je, da XML le ni naš odrešitelj, je "le" zelo uporabno orodje, če ga lahko tako kličem. Ker se ta blog ukvarja predvsem z jezikom Java, bom danes poskusil razdelati XML členilnike (XML parsers) po več kriterijih.
Slika po znanem reku pove več kot 1000 besed, zato bom pokomentiral posamezne standarde oziroma značilnosti le-teh.
Najbolj groba delitev je na drevesni objektni model (Document Object Model) in na pretočne (streaming) členitelje. Za odločitev katero družino uporabiti je odločina velikost dokumentov, ki jih nameravamo obdelovati. Najbolje je, da na pričakovanih realnih primerih izmerimo porabo pomnilnika in procesorskega časa, velja pa ocena, da za dokumente velikostnega razreda nekaj 10 MB ni več optimalna uporaba DOM členiteljev. Seveda je brezpredmetno tudi za Java ME. Če si vseeno lahko privoščimo uporabo DOM Java APi-jev, pa so nekatere rešitve precej elegantne, kot na primer uporaba XPath jezika za poizvedbe po drevesnem objektnem modelu.
Priporočam JDOM, ki je zelo "očiščen" Java API za manipulacijo z XML DOM drevesom. Očiščen pravim zato, ker je DOM W3C-jev standard in členitelji, ki temeljijo na njem morajo upoštevati razne obskurnosti, ki so v specifikaciji zaradi pokrivanja splošnosti med programskimi jeziki.
Naslednja velika delitev je med pretočnimi izvedenkami. Povlečni (pull) in potisni (push) način. Bolj znan je SAX, ki je starejši, a ga začetniki vseeno neradi uporabljajo zaradi kompliciranosti. Sam API je dokaj enostaven, vendar je uporaba v aplikacijah nepotrebno komplicirana. Ima pa zelo dobro lastnost - hitrost. Zaradi zelo majhnega števila objektov, ki se morajo kreirati med členjenjem, je tudi poraba sistemskih virov majhna. Razne skupine so kmalu ugotovile pomanjkljivosti potisnega načina, kot je na primer dejstvo, da členitelj kliče našo aplikacijo in ne obratno, kot se to počne pri potisnih izvedenkah. Iz tega so nastali XPP serija in nazadnje (oktober 2003) tudi StAX standard.
Razlika je v tem, da SAX členitelj prebere XML dokument in nato kliče metode v naši aplikaciji, povlečne členitelje pa kontroliramo iz aplikacije, torej mi povemo členitelju kdaj naj procesira. Imamo torej kontrolo nad aplikacijsko nitjo.
Bistvene prednosti povlečnih pred potisnim SAX so:
- Členjenje preprostih XML dokumentov lahko izvedemo s preprosto kodo.
- Lažje je napisati kodo za rekurzivno členjenje.
- Če med členjenjem enega dokumenta ugotovimo, da potrebujemo informacije iz drugega, lahko to storimo v isti niti.
- Lahko preskakujemo dele XML dokumenta, ki nas ne zanimajo in tako prihranimo čas in procesorsko moč.
- Lahko ustvarimo pretočne cevovode (streaming pipelines).
- Če razvijamo Java ME aplikacijo, uporabimo kurzor API.
- Če želimo imeti brezkompromisno hitrost procesiranja, uporabimo kurzor API.
- Če želimo spreminjati dogodkovni tok, uporabimo iterator API.
- Če delamo ekstenzibilne module, uporabimo iterator API.
- Če smo v dvomih, uporabimo iterator API.
Ni komentarjev:
Objavite komentar