Procesarea fisierelor XML in obiecte si lucrul cu acestea – PHP
7
Update : 11 decembrie 2009
Am promis o serie de articole destul de interesante dupa parerea mea. Acesta este al treilea articol din aceasta serie care il voi publica in urmatoarea perioada. Am inceput sa lucrez la ultima versiune si cea publica a sistemului de securitate ce va include si analiza fisierelor , anti RCE/CSRF dar pastrez linistea pana una alta.Anumite parti ce mi se par interesante le voi publica si le voi explica, pentru ca sunt sigur ca vor prezenta interes unora in viitor.
Ok , sa revenim. Pentru inceput , vom considera ca sunteti familiarizati cu XML si tot ce tine de acesta.In PHP nu prea exista functii care sa creeze obiecte usor de folosit pentru a returna valorilor,argumentele pastrate in acestea.
Clasa creata de mine suporta aproximativ toate operatiile de baza ce pot fi efectuate asupra unui fisier XML.Aceasta are ca dependenta majora clasa cException, studiata si prezentata in urma cu cateva zile pe blog.
Structura clasei :
/** * @name : xmlParser * @description : The XML Parser Class. Parse regular xml file content into array where ___value___ key represents a node value and ___atrr___ key represents the attribute of specific node. This class use cException class for exceptions handling. * @author : Avadanei Andrei * @copyright : 2009 - Avadanei Andrei **/ class xmlParser { private $xmlObject = array(); /* The Parsed XML Object */ private $xmlContent = ""; /* The XML File Content */ private $xmlLength = 0; /* The XML File Length */ public function xmlParser($xmlContent,$xmlLength); public function __construct($xmlContent,$xmlLength); public function getNodeXML($tree = ''); public function addNodeXML($tree = '',$xmlNewNode = '', $addXML = '',$addID=-1); public function editNodeXML($tree = '',$editXML = '',$editID = -1); public function validateObject($object); public function removeNodeXML($tree = '',$editID = -1); public function ObjectToXML($returnXML = TRUE); private function buildObjectToXML($nodes,$push = ''); public function XMLToObject($returnXML = TRUE); }
Observam ca avem posibilitatea de a parsa un fisier XML(continutul acestuia) intr-un obiect XML. De asemenea clasa suporta si operatia inversa. Avem posibilitatea de a elimina un nod si toate subnodurile sale,precum si de a edita sau adauga un nod nou(un string sau un obiect in cazul in care dorim sa adaugam un „sub-obiect”).Avem posibilitatea de a valida un nod si toate subnodurile sale pentru a verifica daca este corect din punct de vedere obiectual fata de structura aleasa de mine.Operatiile asupra atributelor le-am omis,asta putandu-se face manual. Daca voi vedea macar 2-3 persoane dornice sa updatez clasa o voi face.
Structura obiectului XML :
[nod] array( [___attr___] array([atribut 1],[attribut 2] ... [attribut n]); [subnod] array([___value___],[___attr___]); [subnod] ....... [subnod] );
Un nod ce are elementul [___value___] nu poate avea subnoduri, insa unul ce are elementul [___attr___] poate avea subnoduri.Toate subnodurile au „structura” nodului dat in exemplul de mai sus.De asemenea elementele [___value___] si [___attr___] pot lipsi din structura obiectului XML la un anumit nod.
Exemple de folosire :
<?php include('xmlParser.php'); $xml = '<?xml version="1.0" encoding="ISO-8859-1"?> <!-- Edited by XMLSpy® --> <note> <to atttr="test" ab="adsgds"><attr>ss</attr><test>Tove</test></to> <from>Jaani</from> <from>Jaani2</from> <heading>Reminder</heading> </note> '; $xmlL = strlen($xml); $xmlParser = new xmlParser($xml,$xmlL); $siteXML        = $xmlParser->XMLToObject(TRUE); echo $xmlParser->validateObject($siteXML); print_r($siteXML); $xmlParser->removeNodeXML('note/to/attr/'); echo $xmlParser->ObjectToXML(TRUE); $xmlParser->addNodeXML('note/to/','attr',array('___value___'=>'valoareeee2')); $xmlParser->editNodeXML('note/from/',array('___value___'=>'valoareeee2'),0); echo $xmlParser->ObjectToXML(TRUE); ?>
Puteti descarca clasa de mai jos cu exemplele de mai sus , toate functiile avand explicatii complete despre modul in care ar trebui folosite functiile. Atasamentul de mai jos, in cazul exemplelor are inclusa si clasa cException.
Descarca Clasa xmlParser si exemple de folosire
Update
Au fost aduse imbunatatiri acestei clase.Cea mai importanta modificarea a fost posibilitatea de acum incolo de a lucra cu noduri cu acelasi nume.Au fost aduse si alte imbunatatiri minore si au fost fixate cateva bug-uri.Noua versiune o puteti descarca de la aceeasi adresa de mai sus.De asemenea functiile addNodeXML(),editNodeXML() si removeNodeXML() si-au modificat parametrii.Ii puteti vedea mai sus. 🙂
[…] urma cu ceva timp am prezentat o implementare a unei clase destul de cuprinzatoare creata pentru usurarea procesarii fisierelor XML, aducandu-le la o forma obiectuala.Cea mai eficienta modalitate de a prelucra integral un document […]
Salut,
Vroiam sa te intreb, fara nicio rautate ascunsa, de ce ar vrea un anumit developer sa foloseasca clasa asta de procesare XML in locul celor built-in din PHP (SimpleXML, DOMDocument, DOMXPath)? Ce avantaje ar aduce?
Salut,
Stai linistit inteleg rostul intrebarii si eram constient ca ea exista la cineva,doar asteptam sa vad cine va indrazni sa o puna.
Iti voi raspunde la intrebare incercand sa iti exemplific ideea pe care ma bazez cand vin initial cu solutii personale si ma reintorc cu articole in care prezint cele deja existente.
In ziua de azi, utilizatorul se bazeaza tot mai mult pe obiecte,clase si functii deja facute.Imediat cand acestea lipsesc se simte ca si cum nu ar avea membrele.Prin astfel de solutii eu arat ideea de baza ce sta in spatele claselor prezentate. Nu spun ca ar fi perfecte,sau ca ar fi macar aproape de perfectiune, ci, din contra, sunt constient ca prezinta extrem de multe bug-uri, poate unele la care nu ma astept.
DAR, acest lucru nu stiu daca conteaza atunci cand inveti principiul ce sta la baza.Un alt avantaj al acestor prezentari personale consta in faptul ca poate fi si un exercitiu pentru mine in timp ce scriu articolul si pentru cel care il citeste,fiind nevoit sa inteleaga cu adevarat cum gandesc daca chiar vrea sa invete! 😀
Sper ca asta ti-a raspuns la intrebare!
OK, am inteles. Daca scopul este unul (auto-)didactic, nu am nimic impotriva sa se faca asa ceva. Sincer, inteleg problema cu oamenii care asteapa ca totul sa le fie dat pe tava de PHP si am si eu atitudinea Do It Yourself, tocmai pentru a invata lucruri noi. In privinta XML insa, consider ca implementarea DOM din PHP este una destul de buna, de aici si comentariul meu. E adevarat ca multi se plang de API, insa eu cred ca e OK. Ceva mai buna fiind doar o abstractie gen jQuery.
Apropo, bafta cu blog-ul, e o ocazie foarte buna sa inveti atunci cand incerci sa explici altora 🙂
Multumesc! 🙂
Da, se poate spune ca am avut ocazii cand chiar am avut de invatat de pe urma a ce scriu.Desi stiam acele lucruri, le stiam evaziv sau teoretic, iar scriind articolele am fost nevoit sa ma documentez ceva mai cu simt de raspundere pentru a oferi informatii reale cititorilor. 😀
Pana acum am folosit doar DOM din PHP, restul mi s-au parut inutile, acesta avand si o abordare asemenatoare cu cea din Javascript, care imi este si mai familiara. 🙂
Numai bine!
Salut! Mi se pare foarte interesanta aceasta modalitate propusa de tine dar as vrea sa stiu cum pot face sa includ un fisier xml extern. Adica sa nu fie nevoie sa scriu textul fisierului xml in interiorul php shi toata modificarile care le fac sa fie inregistrate in xml extern.
Buna Corina si bun venit pe la noi! 🙂
Rezolvarea la problema ta e foarte simpla si anume implica stocarea informatiilor in fisiere structurate in format XML. Asta inseamna ca nu ramane decat sa deschizi un fisier, sa citesti continutul din el si sa aplici acelasi principiu. Poti citi despre fisiere aici.