E-learn.ro
Panou utilizatori
Utilizator Parola
Creeaza cont nou    Recupereaza parola
Login
Newsletter
Introdu adresa ta de email
Inscrie-te
Inchide panoul de utilizatori
Add to Google

Tutoriale PHP

Descarca toolbar

Toolbar E-learn.ro Facebook Twitter

WEB DEVELOPMENT  /  PHP  /  Introducere in PHP (24)

XI. Pacatos de simplu

03.08.2008
XI. Pacatos de simplu

Cu toate ca PHP a inclus suport pentru cele doua metode standard de analiza XML - SAX si DOM – de la versiunea 4.0, complexitatea si caracterul studios inerent acestor metode le taia cheful tuturor, mai putin celor mai dedicati developeri XML.

Total vizualizari: 3424 3424 afisari   |   Comentarii  0   |   Rating   |   (2 voturi)   |   Timp necesar: 25 min 25 min   |   Nivel de cunostiinte necesar: Mediu  Mediu

Sursa:  www.devzone.zend.com  
Autor:  Vikram Vaswani
Adauga la tutoriale favorit Adauga la tutoriale favorite
Pagina:
1
comenteaza printeaza

O nimica toata
Zilele rele din trecut
Animale blande
Orasul pacatelor
Ce ar putea fi
X merge direct la tinta
O seara la Moulin Rouge

O nimica toata

In afara cazului in care ai trait retras intr-o pestera in ultimii ani, ai auzit despre XML - este kitul de unelte pentru care tot mai multi Web publisheri opteaza in vederea marcarii de continut. Poate chiar ai vazut un document XML in actiune, complet, cu etichete definite de utilizatori si cu marcare, si probabil te-ai intrebat cum oare poate unul sa converteasca un amalgam incalcit de cod in continut accesibil.

Raspunsul este, nu prea usor.

Cu toate ca PHP a inclus suport pentru cele doua metode standard de analiza (a se citi: deslusire) XML - SAX si DOM - de la versiunea 4.0, complexitatea si caracterul studios inerent acestor metode le taia cheful tuturor, mai putin celor mai dedicati developeri XML. Toate acestea s-au schimbat, totusi, odata cu aparitia lui PHP 5.0, care aduce o extensie XML nou-nouta, numita SimpleXML, care elimina orice (si chiar vreau sa spun orice) efort din activitatea de procesare a documentelor XML. Continua sa citesti, si afla cum.

Zilele rele din trecut

Pentru a intelege de ce SimpleXML este atat de cool, se cere o mica lectie de istorie.

Inainte sa apara SimpleXML, existau doua cai de a procesa documentele XML. Prima, SAX sau API-ul simplu pentru XML, presupunea traversarea unui document XML si apelarea unor functii specifice, deoarece analiza structurala intampina diferite tipuri de etichete. De exemplu, ai fi putut sa apelezi o functie pentru a procesa o eticheta de inceput, o alta functie pentru a procesa o eticheta finala, si o a treia pentru a procesa datele dintre acestea. A doua, DOM sau Modelul de Obiect-Document, presupunea crearea unei reprezentari arborescente ale documentului XML in memorie, si apoi folosirea unor metode de traversare a arborelui pentru a o naviga. Odata ce s-a ajuns la un anume nod al arborelui, continutul corespunzator putea fi recuperat si folosit.

Nici una dintre aceste doua abordari nu a fost prea usor de utilizat: SAX necesita ca developerul sa realizeze programe-handler de eveniment pentru fiecare tip de element intampinat intr-un fisier XML, in timp ce abordarea DOM folosea un model de orientare pe obiecte care tindea sa ii sperie pe developeri, in afara de faptul ca dispunea de o memorie mica si deci era ineficienta in cazul documentelor XML mari. De asemenea, intr-un conext mai larg, PHP 4 folosea un numar de diferite biblioteci server pentru fiecare dintre diversele sale extensii XML, ducand la inconsecventa in modul in care lucrau respectivele extensii XML si creand prin urmare neconcordante de inter-operabilitate (si destul de multa confuzie printre developeri).

Cu PHP 5.0, s-au depus eforturi concertate pentru a regla aceasta problema, prin adoptarea bibliotecii libxml2 ca biblioteca standard pentru toate extensiile XML si prin modificarea diverselor extensii XML astfel incat sa opereze mai consecvent. Cea mai mare schimbare in panteonul PHP 5 XML ramane totusi extensia SimpleXML dezvaltata de catre Sterling Hughes, Rob Richards si Marcus Börger, care au incercat sa faca analiza structurala a documentelor XML substantial mai usor de folosit decat era in PHP 4.

SimpleXML functioneaza prin convertirea unui document XML intr-un obiect, iar apoi transforma elementele din acel document in proprietati ale obiectului, care pot fi accesate folosind notatia standard a obiectului. Acest lucru face mai usoara depistarea oricarui element, de la orice nivel al ierarhiei XML, pentru a-i accesa continutul.

Elementele care se repeta la acelasi nivel al arborelui documentului sunt reprezentate ca matrice, in timp ce colectiile obisnuite de elemente pot fi create folosind caile de localizare XPath (despre care, mai tarziu); aceste colectii pot fi procesate folosind constructoarele standard PHP de bucle. Accesarea atributele de elemente este la fel de simpla precum accesarea cheilor unei matrice asociative - nu este nimic nou de invatat, si nici un cod special care ar trebui scris.

Pentru a folosi SimpleXML si PHP impreuna, configuratia ta PHP trebuie sa includa suport pentru SimpleXML. Acest suport este activat in mod predefinit atat in versiunea UNIX cat si cea Windows a lui PHP 5. Citeste mai mult pe aceasta tema in acest tutorial Simple XML. Daca utilizezi PHP 4, nu ai noroc - SimpleXML nu este disponibil decat pentru PHP 5.

Animale blande

Pentru a vedea cum functioneaza SimpleXML, sa luam urmatorul fisier XML:

<?xml version="1.0"?>  
<pet>  
    <name>Polly Parrot</name>  
    <age>3</age>  
    <species>parrot</species>  
    <parents>  
        <mother>Pia Parrot</mother>  
        <father>Peter Parrot</father>  
    </parents>  
</pet>

Acum, ai nevoie sa gasesti o cale de a include continutul intre elementele , , si (nume, varsta, specie, parinti). Cu SimpleXML, este foarte simplu:

<?php  
 
// set name of XML file  
$file = "pet.xml";  
 
// load file  
$xml = simplexml_load_file($file) or die 
("Unable to load XML file!");  
 
// access XML data  
echo "Name: " . $xml->name . "\n";  
echo "Age: " . $xml->age . "\n";  
echo "Species: " . $xml->species . "\n";  
echo "Parents: " . $xml->parents->mother . 
" and " .  $xml->parents->father . "\n";  
 
?>

Actiunea incepe cu functia simplexml_load_file(), care accepta calea si numele fisierului XML a carui structura trebuie analizata. Rezultatul analizei fisierului este un obiect PHP, ale carui proprietati corespund elementelor de sub elementul radacina. Datele caracter de la interiorul unui element vor putea fi apoi accesate folosind notatia standard object->property, incepand cu elementul radacina si coborand pe calea ierarhica a documentului. Se scrie cum se citeste. SimpleXML iti faciliteaza modificarea continutului unui anumit element XML - doar asigneaza o noua valoare proprietatii de obiect corespunzatoare. Iata un exemplu:

<?php  
 
// set name of XML file  
$file = "pet.xml";  
 
// load file  
$xml = simplexml_load_file($file) or die 
("Unable to load XML file!");  
 
// modify XML data  
$xml->name = "Sammy Snail";  
$xml->age = 4;  
$xml->species = "snail";  
$xml->parents->mother = "Sue Snail";  
$xml->parents->father = "Sid Snail";  
 
// write new data to file  
file_put_contents($file, $xml->asXML());  
 
?>

Aici, fisierul original XML este mai intai citit la interior, iar apoi datele caracter care sunt incluse la interiorul fiecarui element sunt modificate prin asignarea de noi valori proprietatii de obiect corespunzatoare. Metoda asXML(), folosita in mod caracteristic pentru a lasa arborele XML in seama programului standard de iesiri, este in acest exemplu combinata cu functia file_put_contents() pentru a suprascrie documentul original XML cu noi date.

Orasul pacatelor

Elementele care se repeta la acelasi nivel al ierarhiei XML sunt reprezentate ca elemente matriceale, si pot fi accesate folosind indici numerici. Pentru a vedea cum functioneaza, sa luam urmatorul fisier XML:

<?xml version="1.0"?>  
<sins>  
    <sin>pride</sin>  
    <sin>envy</sin>  
    <sin>anger</sin>  
    <sin>greed</sin>  
    <sin>sloth</sin>  
    <sin>gluttony</sin>  
    <sin>lust</sin>  
</sins>

Iata secventa de instructiuni PHP care il citeste si care extrage datele din acesta:

<?php  
 
// set name of XML file  
$file = "sins.xml";  
 
// load file  
$xml = simplexml_load_file($file) or die 
("Unable to load XML file!");  
 
// access each <sin>  
echo $xml->sin[0] . "\n";  
echo $xml->sin[1] . "\n";  
echo $xml->sin[2] . "\n";  
echo $xml->sin[3] . "\n";  
echo $xml->sin[4] . "\n";  
echo $xml->sin[5] . "\n";  
echo $xml->sin[6] . "\n";  
 
?>

In functie de cum preferi, poti chiar sa reiterezi colectia cu o bucla foreach(), ca in expresia echivalenta de mai jos:

<?php  
 
// set name of XML file  
$file = "sins.xml";  
 
// load file  
$xml = simplexml_load_file($file) or die 
("Unable to load XML file!");  
 
// iterate over <sin> element collection  
foreach ($xml->sin as $sin) {  
    echo "$sin\n";  
}  
 
?>

Ce ar putea fi

SimpleXML lucreaza cu atributele elementelor la fel de transparent precum elaboreaza insesi elementele si continutul lor. Perechile atribut-valoare sunt reprezentate ca si componente ale unei matrice asociative PHP, si pot fi accesate ca elemente matriceale obisnuite. Pentru a vedea cum functioneaza, urmareste secventa urmatoare de instructiuni:

<?php 
 
// create XML string 
$str = <<< XML 
<?xml version="1.0"?> 
<shapes> 
    <shape type="circle" radius="2" /> 
    <shape type="rectangle" length="5" width="2" /> 
    <shape type="square" length="7" /> 
</shapes> 
XML; 
<?php
// load string 
$xml = simplexml_load_string($str) or die 
    ("Unable to load XML string!"); 
 
// for each shape 
// calculate area 
foreach ($xml->shape as $shape) { 
    if ($shape['type'] == "circle") { 
        $area = pi() * $shape['radius'] * 
        $shape['radius']; 
    } 
    elseif ($shape['type'] == "rectangle") { 
        $area = $shape['length'] * $shape['width']; 
    } 
    elseif ($shape['type'] == "square") { 
        $area = $shape['length'] * $shape['length']; 
    } 
    echo $area."\n"; 
} 
 
?>

Spre deosebire de exemplele anterioare, care foloseau un fisier XML extern, acesta creeaza XML-ul in mod dinamic si il incarca in SimpleXML cu metoda simplexml_load_string(). XML-ul este apoi analizat cu o bucla foreach(), iar zona rezervata fiecarei forme, calculata pe baza valorii atributului de tip al fiecarui element < shape >. Listarea de mai sus arata cum pot fi accesate valorile de atribut ca si chei ale matricei atribut asociate cu fiecare proprietate a elementului.

X merge direct la tinta

SimpleXML asigura de asemenea suport pentru colectiile obisnuite de elemente, prin caile de localizare XPath. Pentru aceia dintre voi care nu sunt familiarizati cu, XPath reprezinta un mecanism standard de adresare pentru un document XML, permitand developerilor sa acceseze colectii de elemente, atribute sau noduri text din cadrul unui document. Citeste mai mult despre XPath la www.w3.org si la www.melonfire.com

Pentru a vedea cum functioneaza, sa consideram urmatorul document XML:.

<?xml version="1.0"?>  
<ingredients>  
    <item>  
        <desc>Boneless chicken breasts</desc>  
        <quantity>2</quantity>  
    </item>  
    <item>  
        <desc>Chopped onions</desc>  
        <quantity>2</quantity>  
    </item>  
    <item>  
        <desc>Ginger</desc>  
        <quantity>1</quantity>  
    </item>  
    <item>  
        <desc>Garlic</desc>  
        <quantity>1</quantity>  
    </item>  
    <item>  
        <desc>Red chili powder</desc>  
        <quantity>1</quantity>  
    </item>  
    <item>  
        <desc>Coriander seeds</desc>  
        <quantity>1</quantity>  
    </item>  
    <item>  
        <desc>Lime juice</desc>  
        <quantity>2</quantity>  
    </item>  
</ingredients>

Acum, sa presupunem ca vrei sa tiparesti toate elementele . Ai putea sa faci acest lucru iterand matricea de elemente < item > , dupa cum am discutat mai devreme...sau ai putea sa creezi doar o colectie obisnuita, compusa doar din elemente < desc > prin metoda xpath() si sa o iterezi, in loc, pe aceasta:

<?php  
 
// set name of XML file  
$file = "ingredients.xml";  
 
// load file  
$xml = simplexml_load_file($file) or die 
("Unable to load XML file!");  
 
// get all the <desc> elements and print  
foreach ($xml->xpath('//desc') as $desc) {  
    echo "$desc\n";  
}  
 
?>

Folosind XPath, poti obtine ceva chiar mai calitativ - de exemplu, creind o colectie compusa numai din acele elemente < desc > carora le corespund cantitati in numar de doua sau mai mult.

<?php  
 
// set name of XML file  
$file = "ingredients.xml";  
 
// load file  
$xml = simplexml_load_file($file) or die 
("Unable to load XML file!");  
 
// get all the <desc> elements and print  
foreach ($xml->xpath('//item[quantity > 
1]/desc') as $desc) {  
    echo "$desc\n";  
}  
 
?>

In lipsa lui XPath, indeplinirea acestui lucru ar fi fost mult mai complicata decat cele cinci randuri de cod de mai sus...incearca si tu si vezi!

O seara la Moulin Rouge

Acum ca ai vazut ce poate face XPath, sa incheiem cu un exemplu care iti arata cum ai putea sa il folosesti in mod efectiv. Sa presupunem ca ai mai multe recenzii de film marcate in XML, dupa cum urmeaza:

<?xml version="1.0"?>  
<review id="57" category="2">  
    <title>Moulin Rouge</title>  
    <teaser>  
        Baz Luhrmann's over-the-top vision of 
        Paris at the turn of the century  is 
        witty, sexy...and completely unforgettable  
    </teaser>  
    <cast>  
        <person>Nicole Kidman</person>  
        <person>Ewan McGregor</person>  
        <person>John Leguizamo</person>  
        <person>Jim Broadbent</person>  
        <person>Richard Roxburgh</person>  
    </cast>  
    <director>Baz Luhrmann</director>  
    <duration>120</duration>  
    <genre>Romance/Comedy</genre>  
    <year>2001</year>  
    <body>  
        A stylishly spectacular extravaganza, Moulin Rouge
        is hard to categorize; it is, at different times, 
        a love story, a costume drama, a musical, and a 
        comedy. Director Baz Luhrmann (well-known for the very
        hip William Shakespeare's Romeo + Juliet) has taken
        some simple themes - love, jealousy and obsession 
        - and done something completely new and different with 
        them by setting them to music.  
    </body>  
    <rating>5</rating>  
</review>

Acum, doresti sa afisezi aceasta recenzie pe site-ul tau web. Deci, ai nevoie de o seventa de instructiuni PHP pentru a extrage datele din acest fisier si pentru a le plasa in locatiile adecvate intr-un sablon HTML. La tot ceea ce ai invatat pana acum, asta e o nimica toata...dupa cum o arata si codul de mai jos:

<?php  
 
// set name of XML file  
// normally this would come through GET  
// it's hard-wired here for simplicity  
$file = "57.xml";  
 
// load file  
$xml = simplexml_load_file($file) or die 
("Unable to load XML file!");  
?>  
<html>  
<head><basefont face="Arial"></head>  
 
<body>  
 
<!-- title and year -->  
<h1><?php echo $xml->title; ?> (<?php echo 
$xml->year; ?>)</h1>  
<!-- slug -->  
<h3><?php echo $xml->teaser; ?></h3>  
 
<!-- review body -->  
<?php echo $xml->body; ?>  
 
<!-- director, cast, duration and rating -->  
<p align="right"/>  
<font size="-2">  
Director: <b><?php echo $xml->director; ?></b>  
<br />  
Duration: <b><?php echo $xml->duration; ?> min</b>  
<br />  
Cast: <b><?php foreach ($xml->cast->person as 
$person) { echo "$person "; } ?></b>  
<br />  
Rating: <b><?php echo $xml->rating; ?></b>  
</font>  
 
</body>  
</html>

Destul de simplu, nu?

Pagina:
1
comenteaza printeaza
Alte tutoriale PHP:
Noteaza acest tutorial
Rating tutorial
 
(2 voturi)
Pentru a nota acest tutorial, trebuie sa fii logat!
Posteaza un comentariu
Pentru a posta un comentariu, trebuie sa fii logat!
0 TOP UTILIZATORI* 0 0
Tutoriale scrise de claibornelara
claibornelara Rang utilizator claibornelara - Incepator
4430
Tutoriale scrise de mcuemica
mcuemica Rang utilizator mcuemica - Incepator
4330
Tutoriale scrise de ellarichards
ellarichards Rang utilizator ellarichards - Incepator
4290
Tutoriale scrise de emonclercheap
emonclercheap Rang utilizator emonclercheap - Incepator
4130
Tutoriale scrise de kheops
kheops Rang utilizator kheops - Mediu
4084
* Acest top reprezinta punctajele acumulate in ultimele 30 de zile.
Action Script CSS Verilog SWF JSON Bridge Flash Swift 3D Fireworks HTML XML Dreamweaver Photoshop PSD Illustrator Fotografie COREL DRAW RoR Powerpoint XHTML Outlook Gimp Sony Vegas SEO StyleSheet Excel MySQL AJAX PHP Word Ruby on Rails Java Javascript Vista Python Lightroom
Promovare:
Daca faci parte din comunitatea E-learn.ro si doresti promovarea acesteia, poti accesa pagina de promovare.
Arhiva newsletter:
Daca ai ratat un numar mai vechi, sau vrei sa revezi care au fost noutatile E-learn.ro la un moment dat, poti accesa arhiva de newslettere.
  Copyright © 2008-2013 E-LEARN.ro. Toate drepturile rezervate. Termeni si conditii.
Conceput si realizat de Neokinetics Software