online: 7; azi: 1412; total: 53418 Webdesign - Phpmysql - 63

Lucru cu XML - SAX

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:


  • xml_parser_create([format]) - Creaza parser-ul (analizatorul), pot fi create mai multe in acelasi script. Format e optional, 'utf-8' daca se doreste acesta.
  • xml_parser_free(parser) - Elibereaza memoria folosita de parametru "parser", care a fost creat cu "xml_parser_create()".
  • xml_parse(parser, "date_xml" [, final]) - Porneste analiza datelor XML, din "date_xml", cu analizatorul "parser". Parametru trei, "final" e optinal, precizeaza ultima bucata de date unde sa se termine analiza.
  • xml_get_error_code(parser) - Daca procesarea esueaza, aceasta functie returneaza un cod de eroare din care se poate gasi cauza problemei.
  • xml_error_string(errorcode) - Returneaza un sir care specifica eroarea gasita de "xml_get_error_code()", dat ca parametru.
  • xml_set_element_handler(parser, start_element_handler, end_element_handler) - Aceasta functie seteaza evenimentele (functiile definite de utilizator) ce trebuiesc apelate la inceputul, apoi inchiderea, unui element.
  • xml_set_character_data_handler(parser, date_handler) - Seteaza evenimentul cu functia ce trebuie apelata cand analiza ajunge la contextul (continutul text) al elementului.
  • xml_set_default_handler(parser, handler) - Seteaza evenimentul "default" care e apelat daca nu a fost definita o anume apelare pentru un eveniment.

In tutorialul urmator este explicat utilizarea modulului SimpleXML.