luni, 10 noiembrie 2008

Ce alegem SAX sau DOM?

In cele ce urmeaza voi incerca sa raspund la cateva intrebari care, sper eu, sa ne ajute sa intelegem mai multe lucruri despre DOM si SAX. So let’s begin:


De ce au fost construite ambele?

SAX(Simple API for XML) si DOM(Document Object Model) au fost ambele concepute cu scopul de a permite programatorilor sa-si “manevreze” informatiile fara a fi nevoie de scrierea unui parser in cadrul limbajelor de programare (ales de catre acestia). Avand informatiile in format XML si cu ajutorul api-urilor de la SAX sau DOM, programul este liber sa foloseasca ce parser vrea. Acest lucru este posibil doar daca asa numitii “scriitori de parser” implementeaza api-urile SAX/DOM in unul din mutiplele limbaje de programare care permite acest lucru: Java, C++, Perl, Python etc.

So, dupa cele spuse mai sus, ne putem da seama ca scopul celor doua este comun. Acum urmarind acelasi tel, fiecare in parte: SAX/DOM are caracteristicile sale.


Ce este DOM?

DOM-ul (Document Object Model) ofera accesul la informatiile stocate in documentul XML sub forma unui graf; astfel el creaza un arbore de noduri (bazat pe structura si continutul din XML) si accesarea la informatii se face prin “interactiunea” cu acest arbore. Textul din documentul XML este “transformat” in mai multe noduri. Desi DOM ne obliga intr-un fel sa folosim un modelul arborelui,XML se comporta foarte bine avand in vedere ca si el are o structura arborescenta. Astfel ca DOM poate stoca informatiile intr-un arbore indiferent de tipul acestora(tabele sau o simpla lista). In DOM, de fapt fiecare nod retine o alta lista de nodurii. Aceste noduri-copii pot contine valori sau pot fi alte referinte catre alte noduri. La prima vedere pare inutil accesul la o valoare a unui nod cautand in lista de copii ai nodului. Daca elementul nodului ar reprezenta doar o valoare atunci putem spune ca nu are rost aceasta cautare, dar de obicei elementele contin date text si alte elemente. Acum am ajuns la un aspect nu prea placut in ceea ce priveste DOM-ul si anume faptul ca necesita “extra work” doar pentru a accesa valoarea unui element dintr-un nod.


Ce este SAX?

Fata de DOM, SAX (Simple API for XML) ofera acces la informatiile din documentul XML prin intermediul unei secvente de evenimente. Cum poate fi acest lucru util? SAX nu a ales sa creeze un obiect Java (default) pe XML (cum a facut DOM) dar are nevoie de urmatoarele:crearea unui astfel de obiect propriu, cat si a unei clase care “asculta” evenimente SAX si care practic creeaza un model al obiectului. Acestea duc la un SAX cat mai rapid cu cat modelul obiectului este mai simplu bineinteles.

Acum sa vedem cam ce fel de evenimente sunt declansate de catre parser-ul SAX. Pentru fiecare tag deschis si inchis SAX produce un eveniment; de asemea dispune de “events” pentru sectiunile #PCDATA si CDATA. Ideea este ca handler-ul nostru trebuie sa interpreteze aceste evenimente cat mai bine posibil. In plus, SAX poate ajuta la convertirea datelor din formatul arborescent DOM in alt format mai comod, iar pentru parsare nu este necesar a se memora intreaga informatie XML ci numai partile dorite.


Care e legatura dintre DOM si SAX?

In momentul de fata, DOM si SAX sunt cele mai populare API-uri pentru manipularea documentelor XML. Dupa cum am vazut mai sus, cele doua difera in provenienta, scop, stil de programare si amandoua au atat puncte bune cat si puncte slabe. Cele mai importante diferente dintre cele doua sunt ca SAX prezinta documentul ca un “event stream” serial (o serie de apeluri la o functie handler, pe masura ce parti din sintaxa XML sunt recunoscute), si nu ca un arbore, cum o face DOM. Acesta este un dezavantaj din punct de vedere al abordarii deoarece SAX nu suporta random-access.

Totusi, in functie de ce vrei sa faci, SAX nu consuma intotdeauna mai putina memorie, plus ca implementarile DOM variaza in cerinta de memorie, cum variaza si in marime si performanta. Si am ajuns la urmatoarea curiozitate (sper):


Cum alegem intre evenimente SAX si DOM trees?

Daca intentionam sa folosim alt cod, script-uri, etc., sa modificam continutul documentului the wise choice ar fi DOM, fiind standardizat si complet. Pe de alta parte, daca avem nevoie sa procesam documentul in mod linear, fara a folosi scripturi si fara sa ai nevoie de informatie contextuala la fiecare etapa, SAX poate oferi o interfata mai ‘directa’. Destul de important e sa ne gandim de cat efort e nevoie sa implementam propriul model document (in loc sa folosim DOM) si cat si cum se va dezvolta aplicatia in viitor.

Si daca nu stii si nu stii cum sa te hotarasti pentru ca esti mai nedecis din fire… mai exista o alternativa si anume combinarea celor doua in acelasi sistem intrucat multe parsere pot produce output DOM si SAX; si exista multe aplicatii care le combina in diferite moduri.

Un comentariu:

Anonim spunea...

intre sax si dom aleg sax. dar intre sax si doom aleg doom. dar intre sex si doom... hmmmmmmm