A Simple API for XML (SAX) XML-adatokat értelmező alkalmazásprogramozási felületet leíró de facto szabvány. A legfrissebb főverziót, a SAX 2.0-t 2000-ben jelentette meg David Megginson, és közkincs. Egy SAX-elemző szakaszos adatfolyamként olvas be XML-adatokat, és az egyes eseményekhez megfelelő visszahívó függvényt hív meg. Egy SAX-használó alkalmazás regisztrálhat alprogramokat visszahívó függvényként, és kiértékelhet így XML-adatokat. Működése A SAX eredetileg Java nyelven jelent meg, és számos Java-felületből állt, azonban manapság szinte minden nagyobb programozási nyelven vannak megvalósításai. A SAX-hoz nem tartozik formális társaság vagy konzorcium, mely nem jellemző XML-specifikációra, azonban a SAX de facto szabvány. Számos metódust határoz meg XML-dokumentumok SAX-elemzővel való elérésére. A SAX eseményorientált, szemben a DOM-mal. A feldolgozási elv egy csatorna fogalmának felel meg. A SAX számos, egy XML-dokumentum folyamatos olvasásakor bekövetkező eseményt határoz meg, melyek állapot nélküliek, nem hivatkoznak korábbi eseményre, és nincs is más eseményekkel kapcsolatuk. Szintaktikai szerkezet észlelésekor a SAX-elemző kezelőfüggvényt indít el, mely szükség esetén az eseményt kezelő önálló eljárást hajt végre.

Így az első karakter beolvasásával már elkezdhető a dokumentum kiértékelése, lerövidítve – főleg interaktív rendszerekben – a szubjektív elérési időt. Emellett a SAX-elemző minimalizálja a memóriaigényt, mivel az épp kiolvasott elem mellett csak a kezelő eljárás által kiválasztott adatok maradnak a memóriában.

A SAX-események a dokumentum beolvasásakor párhuzamosan az elemzőbe kerülnek. Gyakorlatilag ez azt jelenti, hogy történhetnek SAX-események nem jól formált XML-dokumentumokban azok érvénytelennek minősítése előtt. Így a hibakezelés a SAX-elemzőknél fontos, megfelelő osztályok érhetők el Javában. Egy XML-dokumentum SAX-szal való elemzése előtti ellenőrzése ellentmond a SAX természetének, mivel a teljes dokumentumnak kell a memóriába kerülnie, de sok ellenőrző SAX-elemző van. Események a SAX-ban Adott az alábbi dokumentum <?xml version="1.0"?> <szeminárium> <cím>DOM, SAX, SOAP</cím> <tartalom> <fejezet value="1">Bevezető</fejezet> <fejezet value="2">Fő szöveg</fejezet> <fejezet value="3">Összefoglaló</fejezet> </tartalom> </szeminárium> E dokumentum SAX-elemzővel való olvasásakor az alábbi sorrendben történnek az események:SAX QuickstartSAX API Documentation saxproject.org

SAX-esemény MagyarázatstartDocument()Az elemző elérte az XML-dokumentum elejétstartElement("szeminárium",[])egy „szeminárium” nevű elemet talált az elemző, a 2. paraméter („[]”) az elemhez tartozó összes attribútum listája, mely üres, mivel nincs attribútum.characters("\n ")A SAX-elemző két elemcímke közti üres karaktereket is kiír, ez esetben a sortörést („\n”) egy szóköz követi, melyeket az XML-ben a jobb olvashatóságért használnak.startElement("cím",[])characters("DOM, SAX, SOAP")A „cím” elem tartalmaendElement("cím")egy korábbi elem végének elérését jelenticharacters("\n ")startElement("tartalom",[])characters("\n ") mivel a bekezdés 2 szóközből áll, az esemény 2 szóközt ad kistartElement("fejezet", ["value="1""]) a 2. paraméter az attribútumlista, ez esetben egy eleme van, mely „value="1"”.characters("Bevezető")endElement("fejezet")characters("\n ")startElement("fejezet", ["value="2""])characters("Fő szöveg")endElement("fejezet")characters("\n ")startElement("fejezet", ["value="3""])characters("Összefoglaló")endElement("fejezet")characters("\n ")endElement("tartalom")characters("\n")Mivel e sor nincs bekezdve, csak „\n” az eredmény, szóköz nélkülendElement("szeminárium")endDocument() Az elemző elérte az XML-dokumentum végét Minden eseménynél az elemző megszakítja a munkát, és megvárja, hogy a dokumentumkezelőtől megkapja az engedélyt. Ez ez idő alatt az esemény kiértékeléséhez kezelő eljárást indíthat. Ekkor csak a további jelentősebb feldolgozást igénylő eseményekre kell kezelő eljárást írni – ellenkező esetben az elemző azonnal folytathatja az elemzést.

Rendszerek SAX-szal Java-példa Az alábbi Java nyelven írt példában egy dokumentumanalízis része a cím és a fejezetszám kiolvasása és kiadása eredményként. Ehhez importálandók a megfelelő SAX-osztályok és a SAX-elemző. Ezenkívül egy dokumentumkezelő is indítandó, mely az elemző eseményeiről kap információt. Ez a példában a „characters”, „startElement” és „endDocument” metódusokat tartalmazza:

public int count = 0; public boolean cím = false; public String szeminárium = "";

public void characters(char[] ch, int start, int length) throws SAXException { if (cím == true && szeminárium.equals("")) { szeminárium = new String(ch, start, length); cím = false;

public void startElement(String name, AttributeList atts) throws SAXException { if (name.equals("fejezet")) ++count; if (name.equals("cím")) cím = true; }

public void endDocument() throws SAXException { System.out.println("A "+szeminárium + " dokumentumban " + count + " fejezet van."); }

Lua-példa LuaExpatkeplerproject.org (Lua SAX-elemzővel) nyelven az XML-fájlok elemzéséhez visszahívó függvények vannak előkészítve, melyekkel az elemző az adatait az azt meghívó alkalmazásnak adhatja át. Az alábbi program egy XML-fájlt egyszerű szövegként ad vissza. require "lxp" xml_file="XMLfájl.xml"

do local count = 0 callbacks = { StartElement = function (parser, name, attributes) -- Kezdőcímke-- io.write("+ ", string.rep(" ", count*2), name, "\n") count = count + 1 -- Attribútumok -- local attributename for _,attributename in ipairs(attributes) do io.write(" ", string.rep(" ", count*2),attributename,'="',attributes[attributename],'"\n') end end, EndElement = function (parser, name) -- Zárócímke -- count = count - 1 io.write("- ", string.rep(" ", count*2), name, "\n") end, CharacterData = function (parser, text) -- Szöveg -- io.write("----------\n",text, "\n----------\n") end

end p = lxp.new(callbacks) -- Elemzőpéldány létrehozása file = assert(io.open(xml_file .. "","r")) p:parse(file:read("*all")) -- Teljes fájl elemzése -- (soronkénti beolvasás is lehetséges) file:close();collectgarbage()

p:parse() -- Dokumentum lezárása p:close() -- Elemző bezárása Jegyzetek

Fordítás

Források

Bevezetés a SAX-ba SAX-referencia A SAX-projekt honlapja XML Parser Tutorial Top Ten SAX2 Tips

Kapcsolódó szócikkek Streaming API for XML (StAX)

Kategória:Java XML API-k