SAX (Simple API for XML) este utilizat pe scara larga pentru a analiza documente XML. E un API bazat pe evenimente. Functiile pentru aceste evenimente nu sunt standard, ci sunt create de utilizator. Utilizatorul creaza un numar de functii ce sunt apelate cand este recunoscut un anumit eveniment.
Analiza documentelor XML cu SAX este unidirectionala. In timp ce analiza parcurge datele XML, sunt recunoscute bucati din XML precum: elemente, atribute, continut text, fiecare fiind un eveniment, iar datele asociate unui eveniment sunt transmise la o functie creata de utilizator, dupa ce functia termina operatiile analiza XML-ului continua. Datele care au fost analizate anterior nu pot fi recitite decat incepand iar parsarea.
Avantajul principal fata de DOM este faptul ca SAX foloseste mai putina memorie si procesarea datelor poate fi mai rapida.
DOM trebuie sa aibe in memorie tot arborele ierarhic inainte de a incepe analiza documentului XML, fapt ce afecteaza procesarea documentelor XML ce depasesc memoria alocata, (dar se poate depasi aceasta limitare in cazul DOM prin folosirea unui spatiu de pe hard-disc ca memorie). In schimb, cantitatea de memorie folosita de SAX depinde de adancimea imbricarii elementelor si de cantitatea de date a atributelor dintr-un element, ambele fiind mai mici decat marimea arborelui, ceea ce-l face o alternativa mai buna in cazul documentelor XML mari dar cu adancime de imbricare mai mica.
Utilizarea SAX depinde in general de scopul prelucrarii documentului XML, deoarece utilizatorul scrie functiile necesare, dar sunt cativa pasi comuni:
<?xml version="1.0" encoding="utf-8"?> <carti> <titlu titlul="Titlu Carte" id="1"> <autor nume="Nume Autor" /> <text>Un text din carte</text> <pret suma="00" /> </titlu> </carti>
<?php $file = "exemplu_sax.xml"; // Calea si numele fisierului XML // Functie apelata la inceputul fiecarui element // Pe langa $parser (analizatorul), $name e numele elementului // $ar_attr e un array in care sunt stocate atributele din element [nume]=>valoare function startElement($parser, $name, $ar_attr) { // Aici pot fi prelucrate matricea cu atributele ($ar_attr) si numele elementului ($name) echo "<b>$name -</b> "; // Afiseaza numele elementului // Daca matricea contine cel putin un atribut, o parcurge if(count($ar_attr)>0) { foreach($ar_attr as $atr=>$val) { echo " $atr => $val ,"; // Preia si afiseaza numele si valoarea fiecarui atribut } } } // Functie apelata la sfarsitul fiecarui element // Pe langa $parser (analizatorul), $name stocheaza numele elementului (la inchidere) function endElement($parser, $name) { // Aici, daca se mai doreste de facut ceva dupa ce a ajuns la inchiderea elementului print "\n"; } // Functie apelata de fiecare data cand sunt intalnite caractere de date (continut text) in element // Pe langa $parser (analizatorul), $value stocheaza valoarea elementului intalnit (continutul-text) function characterData($parser, $value) { // Aici pot fi manipulate datele din $value echo "$value <br>"; // Afiseaza valoarea transmisa functiei } // Se defineste analizatoru care va fi apelat alaturi de functiile pentru evenimente (definite mai sus) // Pentru a utiliza standardul ISO-8859-1, se sterge parametru 'utf-8' $simpleparser = xml_parser_create('utf-8'); // Daca se doreste anularea preluarii cu majuscule (se sterge // din fata functiei) // xml_parser_set_option($simpleparser, XML_OPTION_CASE_FOLDING, 0); // Evenimentul care apeleaza functiile la inceputul si sfarsitul fiecarui element xml_set_element_handler($simpleparser, "startElement", "endElement"); // Eveniment ce apeleaza functia "characterData()" cand analiza ajunge la continutul din element xml_set_character_data_handler($simpleparser, "characterData"); // Deschide fisierul XML pentru citire if($fo = fopen($file, "r")) { // Preia continutul fisierului intr-un sir while ($date_xml = fread($fo, filesize($file))) { // Transmite datele la parser (analizator) if (!xml_parse($simpleparser, $date_xml, feof($fo))) { // Afiseaza eroarea aparuta daca analiza nu poate fi executata echo xml_error_string(xml_get_error_code($simpleparser)); } } fclose($fo); // Elibereaza memoria folosita pt deschiderea fisierului } else echo "Nu a putut citi $file"; // Elibereaza memoria folosita la parsare xml_parser_free($simpleparser); ?>
Iata o lista cu cele mai importante functii SAX:
<p>Cursuri graruite: <mark>MarPlo.net</mark> , jocuri, anime.</p>
a:hover { font-weight: bold; color: #00da01; }
var num = 12.34567; num = num.toFixed(2); alert(num); // 12.35
$arr = file("a_file.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); var_export($arr);
What time is it? It is a quarter to 5. - Cat este ora? E 5 fara un sfert.
¿Qué hora es? Son las tres menos cuarto. - Cat este ora? E 3 fara un sfert.