Simple API for XML
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:[1][2]
SAX-esemény | Magyarázat |
---|---|
startDocument() | Az elemző elérte az XML-dokumentum elejét |
startElement("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,[1] 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 tartalma |
endElement("cím") | egy korábbi elem végének elérését jelenti |
characters("\n ") | |
startElement("tartalom",[]) | |
characters("\n ") | mivel a bekezdés 2 szóközből áll, az esemény 2 szóközt ad ki |
startElement("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ül |
endElement("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
LuaExpat[3] (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
Ez a szócikk részben vagy egészben a Simple API for XML című német Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.
Források
- David Brownell. SAX2. O’Reilly (2002). ISBN 0-596-00237-8
- Helmut Erlenkötter. XML Extensible Markup Language von Anfang an. Reinbek bei Hamburg: Rowohlt-Taschenbuch-Verlag, 211–229. o. (2003). ISBN 3-499-61209-7
- W. Scott Means, Michael A. Bodie. The Book of SAX. No Starch Press (2002). ISBN 1-886411-77-8
- Bevezetés a SAX-ba (németül)
- SAX-referencia (németül)
- A SAX-projekt honlapja (angolul)
- XML Parser Tutorial (németül)
- Top Ten SAX2 Tips (angolul)
Kapcsolódó szócikkek
- Streaming API for XML (StAX)