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
|
|
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.
|
|
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.
|
|
|
characters("DOM, SAX, SOAP")
|
A „cím” elem tartalma
|
|
egy korábbi elem végének elérését jelenti
|
|
|
startElement("tartalom",[])
|
|
|
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"”.
|
|
|
|
|
|
|
startElement("fejezet", ["value="2""])
|
|
|
|
|
|
|
|
startElement("fejezet", ["value="3""])
|
|
characters("Összefoglaló")
|
|
|
|
|
|
|
|
|
Mivel e sor nincs bekezdve, csak „\n” az eredmény, szóköz nélkül
|
endElement("szeminárium")
|
|
|
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
Kapcsolódó szócikkek