SAX
Lühend lahtikirjutatult on "Simple API for XML" ehk kokkuvõtlikult vahend XMList
andmete kätte saamiseks. Ei saa öelda, et see programmeerija tarbeks eelnevalt
tutvustatud DOMist lihtsam oleks. Aga masinale on kindlasti. SAXi abil kannatab
ka tagasihoidliku arvuti abil hiiglaslikust andmestikust sobivad tulemused välja
noppida.
Iseenesest on ju võimalik XML-faile lugeda nagu tavalisi tekstifaile. Et
reajagu teksti sisse. Sealt sobivad analüüsid teha ning siis jälle järgmine
tekstirida lugeda. Kui parasjagu kasutatavas programmeerimiskeeles muid
võimalusi pole, siis sealtkaudu saab enamiku kindlasti tehtud. SAXi puhul on aga
tööd programmeerija jaoks veidi lihtsustatud. Plokkideks pole enam mitte
tekstiread, vaid XMLi elemendid. Reageerimiseks luuakse sobivad funktsioonid.
Lihtsaimal juhul vaid teated elemendi alguse ja lõpu kohta. Sellisel juhul pole
vaja ise enam tekstifunktsioonidega elemente otsida, vaid piisab sobivale
funktsioonile reageerimisest.
$xml_parser = xml_parser_create();
loob uue parseriobjekti.
xml_set_element_handler($xml_parser, "startElement", "endElement");
määrab, milliste nimedega funktsioonid on vastaval parseril elemendi algusele ja
lõpule reageerimiseks. Tavaliselt jäetakse need inglisekeelsed levinud nimed.
Ning allpool siis avatakse XMLi fail (või ka näiteks mujalt võrgust
veebiaadressi järele tulev voog) lugemiseks. Andmed loetakse plokkide kaupa ning
antakse parserile töötlemiseks. Edasi juba saab igaüks funktsioonide sees teha
nende andmetega seda, mida ta just vajalikuks peab.
Eelmistes peatükkides kasutatud inimeste loetelu puhul saadakse järgmine
väljund:
Algas INIMESED Algas INIMENE Algas EESNIMI Lõppes EESNIMI Algas PERENIMI Lõppes
PERENIMI Algas SYND Lõppes SYND Lõppes INIMENE Algas INIMENE Algas EESNIMI
Lõppes EESNIMI Algas PERENIMI Lõppes PERENIMI Algas SYND Lõppes SYND Lõppes
INIMENE Algas INIMENE Algas EESNIMI Lõppes EESNIMI Algas PERENIMI Lõppes
PERENIMI Algas SYND Lõppes SYND Lõppes INIMENE Algas INIMENE Algas EESNIMI
Lõppes EESNIMI Algas PERENIMI Lõppes PERENIMI Algas SYND Lõppes SYND Lõppes
INIMENE Algas INIMENE Algas EESNIMI Lõppes EESNIMI Algas PERENIMI Lõppes
PERENIMI Algas SYND Lõppes SYND Lõppes INIMENE Lõppes INIMESED
Nagu näha, PHP muutis vaikejuhul elementide nimede tähed suurteks.
Nimede loendamine
Sugugi ei pea kõigile sündmustele reageerima. Kui tahetakse teada saada, et mitu
eesnime on, siis piisab ainult elementide algusele reageerimisest. Ning seal
saab valikuga kontrollida, et kui elemendi nimi on otsitav, siis see sündmus
muutujasse kirja panna.
Kokku 5 eesnime.
SAXi ülesehitus on programmeerimiskeelte juures suhteliselt sarnane. Et Java on
rohkem objektorienteeritud keel, siis tuleb seal luua sündmustele reageeriv
objekt. Ehk siis kõigepealt sobivat tüüpi klass ning pärast new-käsuga klassi
põhjal objekt. Samast failist saadakse aga ikka samapalju eesnimesid.
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class EesnimedeLoendaja extends DefaultHandler{
int eesnimedeArv=0;
public void startElement(String nimeruum, String kohalik,
String element, Attributes at){
if(element.equals("eesnimi"))eesnimedeArv++;
}
public void endDocument(){
System.out.println("Leiti "+eesnimedeArv+" eesnime.");
}
public static void main(String argumendid[]) throws Exception{
XMLReader lappaja=
SAXParserFactory.newInstance().newSAXParser().getXMLReader();
lappaja.setContentHandler(new EesnimedeLoendaja());
lappaja.parse("inimesed.xml");
}
}
Ülesandeid
* Loo XML-fail, kus on kirjas autode registreerimisnumbrid. Teata, mitu
registreerimisnumbrit failis on.
* Teata XML-failis leiduvad kõik erinevad elemendinimed.
Andmete püüdmine
Elemendisisude kätte saamise jaoks on tüüpilise käskluse nimeks characters.
Enamasti saadakse sisu kätte ühekorraga, aga selles ei pruugi kindel olla. Võib
vabalt juhtuda, et loetav sisu ei satu ühte plokki ning sel juhul võib see mitme
osana kohale jõuda, igal korral käivitatakse characters just selle sisuga. Kui
soovitakse saada vaid kindla nimega elemetide sisusid, siis tuleb startElement
ning endElement-käskluste sees muutujas lülitina meeles pidada, et kas parajasti
tulevat teksti on vaja välja trükkida või mitte. Et kui ollakse eesnime alguse
ja lõpu vahel, siis tuleb, muidu mitte.
Nagu näha, tulid eesnimed välja:
Juku Juku Kalle Mari Oskar
Kui soovida kõiki XMLi kirjetes olevaid andmeid püüda, siis üheks võimaluseks on
vastavaid muutujaid lihtsalt juurde teha. Ning kui lõppeb element "inimene",
siis peaksid selleks ajaks ka kõik selle inimese andmed ükshaaval muutujates
olema ning on võimalik andmestikuga seda ette võtta, mis parajasti vajalik on.
";
}
}
function characters($parser, $tekst){
global $kasEesnimi, $kasSynniaasta,
$eesnimi, $synniaasta;
if($kasEesnimi){$eesnimi=$eesnimi.$tekst;}
if($kasSynniaasta){$synniaasta=$synniaasta.$tekst;}
}
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characters");
$f=fopen("inimesed.xml", "r");
while($andmed=fread($f, 4096)){
xml_parse($xml_parser, $andmed, feof($f));
}
xml_parser_free($xml_parser);
?>
Juku sündis 1963. aastal.
Juku sündis 1961. aastal.
Kalle sündis 1975. aastal.
Mari sündis 1981. aastal.
Oskar sündis 1971. aastal.
Ülesandeid
* Teata auto registreerimisnumbrite failist kõik need numbrid, mis lõppevad ühe
või kahega.
* Koosta XML-fail autode registreemisnumbrite, markide ja väljalaskeaastatega.
Moodusta SAXi abil SQL-laused nende andmete üle kandmiseks andmebaasi.
RSS
XML on lihtsalt põhireeglite kogum, mis aitab andmeid masinal kergemini leida ja
töödelda. Põhiline XMLi kasutus leiab ikka aset XMLi peale ehitatud vormingus
andmeid vahetades. Üheks selliseks levinud vorminguks on RSS. Iseenesest lihtne
moodus teadete ülesmärkimiseks ja edasi saatmiseks. Kui järgnevat Eesti
Päevalehest pärinevat näidet piiluda, siis on näha, et kõigepealt on kanali
pealkiri ja kirjeldus ning siis tulevad üksikud teated. Standardi kinnitamine on
vajalik selleks, et eri programmid teaksid samu asju samade nimede alt otsida.
Ehk siis pealkirja jaoks on element nimega "title" ning kirjelduse jaoks
"description". Hoolimata sellest, et kohustuslikke elemente on suhteliselt vähe,
on RSSi kirjeldavas skeemis kirjas päris suur hulk omadusi, mida saab soovi
korral sisse panna ning millele on ka nimed antud. Skeemi võib leida aadressilt
http://www.thearchitect.co.uk/schemas/rss-2_0.xsd
Järgnevalt lõik Eesti Päevalehe RSSist, mida võib lugeda aadressilt
http://epl.ee/rss/