Simple API for XML neboli SAX je alternativní rozhraní XML parserů,
osobně si myslím, že je pro běžného programátora užitečné jen ve velmi
speciálních případech, a proto se u něj jen rychle teoreticky zastavíme.
13.7.2004 15:00 | Aleš Hakl | přečteno 13914×
Simple API for XML neboli SAX na rozdíl od rozhraní DOM nenačítá dokument do stromu v paměti, ale pouze jej proudově čte a volá funkce/metody/signály, které si aplikace k tomuto účelu nastavila. Dle mého názoru to není příliš uživatelsky přívětivé, ale pokud pouze potřebujeme dokument rychle projít a nepotřebujeme funkcionalitu DOM, je to rozhodně rychlejší. Za zmínku jistě stojí, že většina implementací DOM používá SAX jako rozhraní k vlastnímu parseru.
Implementací SAXu je velmi mnoho, a protože se nejedná o žádný standard, ale spíše takovou úmluvu, je každá poněkud odlišná. Proto se nebudu zabývat konkrétními detaily a omezím se pouze na popis jednotlivých událostí, které jsou ve všech implementacím více méně identické.
Tato událost je vyvolána pro znaková data ve vstupním proudu. Stejně jako textové uzly v DOM stromu může být vyvoláná několikrát po sobě. V případě SAXu je tato situace navíc daleko pravděpodobnější, jelikož k událostem často dochází již při načítání dokumentu, které se může zastavit uprostřed textu.
Tato událost je, jak již název napovídá, vyvolána na konci dokumentu. Také je vyvolána v případě, že dojde k nějaké chybě během zpracování (dokument není well-formed a podobně).
Výskyt uzavírajícího tagu elementu vyvolá tuto událost, jako parametr dostaneme jméno elementu a v případě SAX2 (s podporou jmenných prostorů) také jeho lokální jméno (část za dvojtečkou) a URI jmenného prostoru.
Tato událost dostupná pouze v SAX2 nás informuje o tom, že prefix jmenného prostoru pozbyl platnosti. Pro běžné zpracování dokumentu nepotřebujeme tuto událost nijak řešit.
Pokud by naše aplikace potřebovala zpracovávat mezery, nové řádky a podobné znaky, které se v XML slučují do jednoho, použijeme tuto událost.
Událost processingInstruction
je vyvolána při výskytu instrukce pro zpracování, jako parametry dostaneme cíl instrukce a vlastní obsah. Na rozdíl od události characters
je vyvolána vždy pro celou instrukci.
Pokud parser z nějakého důvodu přeskočí entitu, vyvolá tuto událost. Důvodem k přeskočení entity může být například to, že neví, za jaký obsah jí má nahradit.
Toto je první skutečná událost, která je vyvolána při zpracování XML dokumentu. Je to vhodné místo pro přípravu datových struktur do kterých načítáme a podobně.
Otevírající tag elementu způsobí tuto událost. V parametrech nalezneme jeho jméno (a případně lokální jméno a URI jmenného prostoru) a atributy v podobě poměrně zajímavé datové struktury obsahující i různé další užitečné informace kromě hodnoty, ovšem právě v řešení této struktury se implementace často liší, například v PHP je použito běžné asociativní pole.
Tato událost, jež je protějškem události endPrefixMapping
, nám oznamuje, že parser vstoupil do rozsahu platnosti prefixu jmenného prostoru. V běžných aplikacích se nemusíme touto událostí znepokojovat, protože parametry události startElement
a jiné jmennými prostory ovlivňované hodnoty jsou správně nastaveny a rozvinuty automaticky. Dokumentace SAX2 uvádí, že tato metoda je užitečná v případě výskytu prefixů jmenných prostorů v textu nebo hodnotách atributů, osobně jsem takový dokument ještě neviděl.
Při tvorbě tohoto popisu jsem vycházel z originální dokumentace javového SAX2 a SAX. Různé implementace se výrazně liší. Jistě se najdou aplikace, pro které je SAX vhodný, ale vzhledem k tomu, že se jedná o dost nízkoúrovňovou záležitost, myslím, že jako rychlý úvod tento článek stačil, a kdo má důvod SAX použít, jistě si sám potřebnou dokumentaci najde a nebo položí dotaz v diskuzi. Příště se, jak jsem již slíbil minule, podíváme na jazyk XSLT určený pro transformace XML dokumentů.