Ugrás a tartalomhoz

Simple API for XML

Ellenőrzött
A Wikipédiából, a szabad enciklopédiából

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

[szerkesztés]

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

[szerkesztés]

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"> 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

[szerkesztés]

Java-példa

[szerkesztés]

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

[szerkesztés]

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

[szerkesztés]

Fordítás

[szerkeszté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

[szerkesztés]

Kapcsolódó szócikkek

[szerkesztés]