Információtartalom és feldolgozási stratégiák

Egy jól-formázott XML dokumentumot önmagában tekintve csak egy karakterhalmazt látunk, azonban ennél többre is értékelhetjük ha megismerjük a belőle kinyerhető információtartalmat. A W3C ennek érdekében kidolgozott egy ajánlást, amit elnevezett InfoSet-nek és ebben kialakította a jól-formázott XML dokumentumok információtartalmának leírására szolgáló absztrakt adathalmazt.

Egy XML dokumentum rendelkezik Infoset-tel, ha

Alapvetően információelemekből áll, amelyek az XML dokumentumok részeinek absztrakt leírása, melyhez névvel ellátott tulajdonságok tartoznak. Legalább egy elemet, a gyökérként funkcionáló document elemet tartalmazza. A legfontosabb információs elemek a következőek a létező 11 közül:

A W3C oldaláról példa alapján könnyen megérthető, hogy miként is kell elképzelni ez az absztrakt információtartalmat.

<?xml version="1.0"?>
<msg:message doc:date="19990421"
     xmlns:doc="http://doc.example.org/namespaces/doc"
     xmlns:msg="http://message.example.org/">Phone home!</msg:message>

Ennek az XML dokumentumnak az InfoSet-je az alábbi információt hordozza:

Ezek után fontos még megemlíteni, hogy mi nincs jelen az InfoSet-ben:

Ami miatt lényeges volt ezt áttekinteni az az, hogy az InfoSet a feldolgozási stratégiákban visszaköszön, mert ez képzi az alapjukat. A legfontosabb implementációja a DOM és az XPath adatmodelljében van. Mielőtt azonban erre rátérnénk, még fontos megemlíteni, hogy létezik az InfoSet-nek egy kibővített változata, amelyet az érvényesítés során kapunk. Magát a folyamatot InfoSet Augmentation néven vezetik be, az általa előálló (augmentated InfoSet) dokumentumot pedig Post-Schema-Validated InfoSet (PSVI) néven ismerhetjük. A legfontosabb, hogy ezt érvényesítés során kapjuk, de erre a séma nyelvek közül csak az XML Schema használható fel.

Nyelvfüggetlen feldolgozási stratégiák: DOM és SAX

A Dokumentum Objektum Modell (Document Object Model / DOM) egy platform- és nyelvfüggetlen standard programozói interfész amely a HTML, XHTML, XML valamint rokon formátumaiknak a szerkezetét és az objektumaikkal történő interakciókat modellezi. A DOM egymással szülő-gyermek kapcsolatban álló objektumok rendszere. A dokumentum tartalmát, illetve a dokumentum valamennyi összetevőjét magában foglalja és a módosítás eredménye mindig visszahat böngészők esetén a megjelenített oldalra.

Megszületése alapvetően az 1990-es évek böngészőháborújához vezethető vissza, melyet végül a W3C standardizálási folyamata fejezett be. A DOM legelső 1998-as verziója két újabb jelent meg, 2000 és 2004-ben. Jelenleg is a 2004-es ajánlás van érvényben, de 2012 óta készül a legújabb 4-es verziója is. Emellett még érdemes megemlíteni a 2012-ben az ajánlást még ugyan el nem érő, de már csak egy lépésre lévő szerver oldali események interfészét is.

A DOM architektúráját az alábbi ábra szemlélteti:

2.1. ábra - A DOM architektúrája


A DOM legfontosabb jellemzői:

  • a dokumentumot logikailag faként ( Node objektumok hierarchiája) kezeli ( szerkezeti modell )

  • objektummodell a klasszikus OO értelemben

    • a dokumentumok (és azok egyes részei) azonossággal, struktúrával, viselkedéssel és kapcsolatokkal is rendelkező objektumok

  • a DOM API kétféle lehetőséget biztosít:

    • egy öröklődési hierarchián alapuló OO megközelítést

    • egy egyszerű (kilapított) nézetet ( „ everything is a Node ” )

  • Alkalmas dokumentumok

    • létrehozására, felépítésére

    • szerkezetének bejárására

    • elemek ill. tartalom hozzáadására, módosítására, törlésére

  • modulokból áll (kékkel a DOM Core , sárgával az XML DOM)

    2.2. ábra - A DOM moduljai (részlet)

    A DOM moduljai (részlet)


A DOM használata a következő ábrával szemléltethető:

A SAX egy eseményvezérelt értelmező, ami azt jelenti, hogy nem hoz létre egy reprezentációs modellt, mint a DOM, melyet aztán tetszőleges módon bejárhatunk, hanem a dokumentum feldolgozása - mintha csak végig olvasnánk - lineárisan történik. Egy adatfolyamként kezeli a dokumentumot és az értelmezés során bizonyos pontokhoz érve különböző események váltódnak ki, melyekre a programozó az API függvények megfelelő implementálásával reagálhat. A SAX alapvetően nem a W3C gondozásában áll, hanem mindig a Java nyelvi verzió a meghatározó.

A SAX használata a következő ábrával szemléltethető:

A DOM-mal szemben nincsenek magának az XML dokumentumnak a reprezentálására szolgáló osztályok, hanem az értelmező egy interfészen keresztül szolgáltatja a feldolgozás alatt lévő dokumentumban szereplő adatokat az adott program számára függvényhívások segítségével. Alapvetően négy típussal dolgozik:

  • szöveges csomópontok

  • elem csomópontok

  • feldolgozó utasítások

  • megjegyzések.

Ez a módszer a SAX értelmezőnek rendkívüli gyorsaságot és kiváló memóriagazdálkodást kölcsönöz, ugyanis jóval kevesebb memóriát igényel, mint az előzőekben tárgyalt DOM értelmező. A nagy hátránya az, hogy használata bonyolultabb tervezést és implementálást eredményez, mivel nincsenek előre elkészített eszközeink, melyek segítségével a dokumentum szükséges részeit egyszerű módon ábrázolhatnánk és tárolhatnánk. Ezeket a fejlesztőnek kell megterveznie és megvalósítania.

A SAX API használata abban az esetben tanácsos, amikor nagy méretű XML dokumentumok feldolgozása a cél. Ebben az esetben egyrészt kevesebb tárterület szükséges az értelmezés alatt, másrészt lokális fájloknál jelentős sebességnövekedést érhetünk el a DOM API alkalmazásával szemben. Amennyiben belső referenciák használatára vagy az elemek véletlen elérésére van szükségünk - ezáltal a dokumentum jelentős részét használva -, akkor bonyolultsága miatt tanácsosabb hanyagolni ezt az API-t.

A DOM és a SAX gyors összevetése:

  • DOM

    • Fa alapú modell (az adatok csomópontokban vannak)

    • Gyors elérés

    • Lehetőség a csomópontok hozzáadására/törlésére

  • SAX

    • Markup elérésekor hívódnak meg a metódusok

    • Nagyobb teljesítmény

    • Kevesebb memória

    • Inkább csak a dokumentum végigolvasására, nem módosítására