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.

1. Utilizarea SAX

Utilizarea SAX depinde in general de scopul prelucrarii documentului XML, deoarece utilizatorul scrie functiile necesare, dar sunt cativa pasi comuni:

  1. Determinarea evenimentelor care se doresc folosite.
  2. Scrierea functiilor ce vor fi apelate pentru fiecare eveniment, de cele mai multe ori pentru scrierea datelor, inceputul si sfarsitul unui eveniment.
  3. Crearea unui parser folosind "xml_parser_create()" si apoi apelarea lui cu "xml_parse()".
  4. Eliberarea memoriei cu "xml_parser_free().".

Urmatorul exemplu arta modul de creare si utilizare a acestor functii de baza. Ca model, va fi folosit urmatorul document XML, stocat intr-un fisier "exemplu_sax.xml":
<?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>
- Cu functiile definite mai jos, vor fi prelucrarte si afisate numele, atributele si continutul text din fiecare element al acxestui document XML.
Documentatia din cod explica detaliat rolul si utilizarea fiecarei functii.
<?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);
?>

- Acest script va afisa urmatorul rezultat:
CARTI -
TITLU - TITLUL => Titlu Carte , ID => 1 ,
AUTOR - NUME => Nume Autor ,
TEXT - Un text din carte
PRET - SUMA => 00 ,
- Observati ca numele elementelor si atributelor sunt receptionate si returnate de SAX cu majuscule. In mod initial, SAX foloseste aceste nume cu majuscule iar formatul caracterelor e ISO-8859-1.
Pentru a anula preluarea cu majuscule si folosirea unui alt format (US-ASCII sau UTF-8) se poate utiliza functia "xml_parser_set_option()", care preia ca prim argument parserul creat, apoi o constanta: XML_OPTION_CASE_FOLDING sau XML_OPTION_TARGET_ENCODING pentru format; al treilea argument este optiunea acelei constante.
De exemplu, pentru anularea preluarii cu majuscule si utilizarea coding-ului UTF-8, se foloseste urmatorul cod la definirea analizatorului:
// Se defineste analizatoru
$simpleparser = xml_parser_create();
// Anuleaza preluarea cu majuscule si foloseste formatul UTF-8
xml_parser_set_option($simpleparser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($simpleparser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
- Pentru definirea formatului de codare, se poate specifica direct in functia "xml_parser_create('utf-8')".

2. Functii SAX

Iata o lista cu cele mai importante functii SAX:



In tutorialul urmator este explicat utilizarea modulului SimpleXML.

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Care tag se foloseste in <table> pentru a crea celula de tip "header"?
<thead> <th> <td>
<table><tr>
  <th>Title 1</th>
  <th>Title 2</th>
</tr></table>
Ce proprietate CSS seteaza distanta dintre randuri?
line-height word-spacing margin
.some_class {
  line-height: 150%;
}
Care functie deschide o noua fereastra.
alert() confirm() open()
document.getElementById("id_button").onclick = function(){
  window.open("http://coursesweb.net/");
}
Indicati functia PHP care returneaza un array cu numele fisierelor si directoarelor dintr-un director.
mkdir() scandir() readdir()
$ar_dir = scandir("dir_name");
var_export($ar_dir);
Care din urmatoarele forme a verbului "sleep" (a dormi) se foloseste pentru viitor?
sleeping slept will sleep
He will sleep there.
- El va dormi acolo.
Care din urmatoarele forme a verbului "dormir" (a dormi) se foloseste pentru viitor?
dormido dormirá durmiendo
Él dormirá allí.
- El va dormi acolo.
Lucru cu XML - modelul SAX

Last accessed pages

  1. Prezentul simplu - Exercitii si teste incepatori (758)
  2. Butterfly Kyodai (2204)
  3. Bubbles3 (3488)
  4. Conditional IF in Limba Engleza - Fraze Conditionale (986)
  5. Zilele saptamanii - Lunile anului - Anotimpurile - Engleza (432)

Popular pages this month

  1. Bubbles3 (3488)
  2. Gramatica limbii engleze - Prezentare Generala (2797)
  3. Prezentul simplu si continuu - Present Tense Simple and Continuous (2526)
  4. Butterfly Kyodai (2204)
  5. Zuma Deluxe (2083)