online: 10; azi: 472; total: 52478 Webdesign - Phpmysql - 62

Lucru cu XML - DOM

  • Pentru exemplele prezentate e nevoie de PHP 5+

1. Module de lucru cu XML

Pentru a prelucra in PHP datele dintr-un document XML trebuie ca acesta sa aibe structura si sintaxa corecta comform standardului XML, nu e nevoie sa fie strict valid, adica sa contina si DTD (vedeti explicatii despre asta in lectia precedenta), dar indicat e sa fie si valid.
Sunt trei moduri (module) pentru lucrul cu XML: SimpleXML, DOM (Document Object Model) si SAX (Simple API for XML); toate trei sunt incluse in PHP. Fiecare are avantaje si minusuri, pot fi folosite oricare din ele pentru a lucra cu datele din XML, pt. a crea, extinde si modifica documente XML.
In continuare iata cate ceva, pe scurt, despre aceste module, dupa care va fi explicat DOM, iar in lectia urmatoare si celelalte doua.


        SAX
  • - SAX este mai usor de invatat, dar trateaza in esenta XML ca un sir de date. Acest lucru face dificila adaugarea de noi elemente sau atribute, ori modificarea unuia anume.
  • - SAX e util pt. lucruri repetitive ce pot fi aplicate tuturor elementelor de acelasi tip. De exemplu, inlocuirea uni anumit element cu tag HTML pt. a transforma XML in HTML.
        DOM
  • - Extensiile PHP DOM citesc documentul XML si creaza pe baza acestuia, in memorie, un obiect cu o structura ierarhica de tip arbore, incepand cu un element (sau obiect) numit Nod (Node), elementele (obiectele) care sunt cuprinse (incadrate) in acesta se numesc Copii (Children) ai acestui obiect, iar elementele care-l cuprind (contin) pe el se numesc Parinti (Parents). Cu functiile specifice DOM se poate obtine, modifica sau crea oricare din aceasta ierarhie sau continutul, textul din ele. Apoi aceste date se pot folosi independent, fiecare unde este necesar. Dezavantajul poate fi faptul ca foloseste mai multe resurse, memorie.
    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 prin folosirea unui spatiu de pe hard-disc ca memorie.
        SimpleXML
  • - SimpleXML lucreaza cel mai bine pentru deschiderea si citirea rapida a datelor unui document XML, converteste elementele si atributele din XML in variabile native PHP (siruri, matrice) care pot fi utilizate dupa cum se face normal cand sunt scrise in PHP.
  • - SimpleXML foloseste mai putina memorie decat DOM, economiseste resurse si timp prin faptul ca necesita putine linii de cod, executa mai putine apelari decat fac SAX si DOM. Minusul acestuia sunt unele probleme ce pot apare cand e vorba de elemente imbricate mai adanc.

2. DOM XML

Document Object Model (DOM) e un modul complet pentru crearea, editarea si manipularea datelor din documentele XML. Deoarece aceste date sunt retinute in memorie sub forma de arbore ierarhic, e recomandat ca documentul XML sa fie valid.
Fiecare element e transformat intr-un Obiect si e vazut ca un Nod ce poate avea Continut, Parinti si Copii; incepand cu elementul radacina. La randul lor, fiecare din acestia putand fi un Nod si interpretat ca un Obiect separat, devenind totul o structura legata dar si individuala.
Aceasta structura poate fi modificata cu functii speciale (dintr-o librarie de functii cum e "gnome-libxml2" care sunt implementate in PHP) si rescrisa iar intr-un format XML.

Exemplu 1 - Creare document XML cu PHP

Pentru a intelege despre ce e vorba, vom lua un exemplu practic. Vom crea cu PHP un document XML cat mai simplu, folosind functiile DOM XML. Etapele de lucru sunt urmatoarele:
  • 1. Se creaza in memorie un nou obiect XML.
  • 2. Se creaza si adauga cateva elemente, un atribut si un continut text. Aici alcatuim o structura cu tag-uri HTML
  • 3. Se vor scrie (salva) datele intr-un fisier .xml (denumit "exemplu_dom.xml") pe server (PHP trebuie sa aiba permisiuni de scriere pe server).
- Codul PHP pentru crearea acestuia este urmatorul. Explicatiile necesare le gasiti in cod.
<?php
$doc = new DomDocument('1.0', 'utf-8');                                 // Se creaza in memorie un nou obiect DOM
$root = $doc->createElement('html');                           // Se creaza primul obiect element, radacina
$root = $doc->appendChild($root);                              // Se adauga in structura documentului, ca element
$body = $doc->createElement('body');                           // Se creaza un alt element, 'body'
$body = $root->appendChild($body);                             // Se adauga 'body' ca element copil in radacina
$body->setAttribute('bgcolor', '#e8e8fe');                     // Se seteaza un atribut pt. elementul doi (body)
$graff = $doc->createElement('p');                             // Se creaza un alt element, 'p'
$graff = $body->appendChild($graff);                           // Se adauga 'p' ca element copil in 'body'
$text = $doc->createTextNode('Un text pentru continut');       // Se creaza un continut text
$text = $graff->appendChild($text);                            // Se adauga continutul text in 'p'

// Salveaza, scrie datele create in obiectul $doc
// Afiseaza mesaj daca a putut salva fisierul pe server sau nu
if($doc->save("exemplu_dom.xml")) echo 'Documentul exemplu_dom.xml a fost creat';
else  echo 'Eroare: documentul exemplu_dom.xml nu a putut fi creat';
?>
- Copiati acest script intr-un fisier .php si apelati-l din browser, daca va crea cu succes fisierul "exemplu_dom.xml" va afisa un mesaj afirmativ.
- Ca sa vedeti rezultatul, deschideti acest fisier cu un editor de text (sau un browser).

Exemplu 2 - Modificare document XML cu PHP

Dupa ce e creat, sau aveti deja un document XML, poate apare necesitatea de a modifica ceva la el, schimbarea continutului unui element, adaugarea unui element nou, sau altele.
In urmatorul exemplu puteti invata cum se poate face cu PHP DOM cateva modificari la datele dintr-un document XML si salvate in alt fisier .xml.
Va fi folosit documentul creat in primul exemplu, la care va fi modificat continutul text din elementul (tag-ul) 'p' si va fi adaugat un alt element 'div' in acelasi parinte unde e si 'p'. Explicatiile necesare le gasiti in cod.
Etapele sunt urmatoarele:
  • 1. Se creaza un nou obiect in memorie si se adauga in el datele dintr-un document XML existent.
  • 2. Se preia si parcurg elementele (care devin Nod-uri) din documentul adaugat.
  • 3. Cand parcurgerea ajunge la elementul caruia dorim sa-i adaugam un nou continut text, adauga (modifica) pe cel existent, creaza un nou element cu nume si text pe care-l adauga dupa cel modificat (in acelasi parinte)
<?php
$file = 'exemplu_dom.xml';                // Calea si numele fisierului .xml

$doc = new DOMDocument();                 // Creaza un nou obiect in memorie
$doc->load($file);                        // Incarca datele din $file in obiectul nou creat
$get_elms = $doc->getElementsByTagName("*");     // Preia toate elementele ("*") stocate in obiect
$nr_elms = $get_elms->length;              // Obtine numarul de elemente (Nodes) preluate

// Parcurge variabila cu obiectul ce stocheaza elementele (Nod-urile)
for($i = 0; $i<$nr_elms; $i++) {
  $node = $get_elms->item($i);              // Preia fiecare Nod din parcurgere
  $element = $node->nodeName;               // Obtine numele elementului

  // Daca elementul este 'p', ii adauga alt continut text
  if($element=='p') {
    $node->nodeValue = 'Un continut text nou';

	// Creaza noul element dupa 'p' (in elementul Parinte unde se afla si 'p'), cu nume si continut text
	$element_nou = $doc->createElement('div', 'Acesta este elementul nou adaugat');
	$node->parentNode->appendChild($element_nou);          // Adauga in elementul parinte noul element creat
  }
}

// Daca poate salva noul continut XML (din obiectul $doc) intr-un fisier .xml
// Preia continutul si intr-un sir (cu "saveXML()") pt. a afisa rezultatul obtinut
if($doc->save('exemplu2_dom.xml')) {
  echo htmlentities($doc->saveXML());
}

// Daca doriti rescrierea primului document XML, inlocuiti 'exemplu2_dom.xml' cu numele aceluia
?>

- O lista cu mai multe functii utile in lucrul cu DOM si XML in PHP gasiti la pagina -> Functii DOM XML

In tutorialul urmator este explicat utilizarea modulului SAX.