Cum sa transformam fisierul XML intr-o baza de date?
11Zilele acestea, unul dintre cititorii WorldIT m-a intrebat cum ar putea imita o baza de date cu articole in care modalitatea de stocare a informatiilor este bazata pe fisiere XML.In speranta ca i-am inteles dorinta voi incerca sa scriu cateva randuri despre aceasta idee, axandu-ma doar pe adaugarea unui articol in fisierul XML, restul facandu-se intr-o modalitate similara.
In 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 XML este construirea unui obiect XML dupa ce acesta a fost citit, avand loc prelucrarile acestuia.
Pregatirea obiectului XML
<?php include('xmlParser.php'); //pregatim fisierul XML pentru procesare $xmlFile = 'fisier.xml'; $xmlContent = file_get_contents($xmlFile); $xmlLength = strlen($xmlContent); //generam obiectul XML $xmlParser = new xmlParser($xmlContent,$xmlLength); $xmlObject = $xmlParser->XMLToObject(TRUE); ?>
Structura fisierului XML
Am ales o structura minimala pentru a putea fi usor de inteles de cei care doresc sa implementeze un sistem similar.
<?xml version="1.0" encoding="ISO-8859-1"?> <root> <info> <articleCount> 1 </articleCount> </info> <content> <article> <title>Titlu articol</title> <author>Autor</author> <date>data1</date> <artcontent>Textul articolului</artcontent> </article> </content> </root>
Datorita functiilor oferite de clasa XML vor putea exista 2 metode de a adauga un articol nou in „baza de date”.
1. Cu un string ce este valid structurii noastre alese anterior.
In prima situatie, vom prelua obiectul anterior si vom crea un string XML valid, folosindu-ne de clasa xmlParser vom transforma ambele fisierele XML in obiecte si vom uni obiectul XML in obiectul mama, cel provenit din fisierul : fisier.xml (unde sunt stocate articolele).
<?php include('xmlParser.php'); //pregatim fisierul XML pentru procesare $xmlFile = 'fisier.xml'; $xmlContent = file_get_contents($xmlFile); $xmlLength = strlen($xmlContent); //generam obiectul XML $xmlParser = new xmlParser($xmlContent,$xmlLength); $xmlObject = $xmlParser->XMLToObject(TRUE); //preluam numarul de articole $articleCount = $xmlParser->getNodeXML('root/info/articleCount/'); $articleCount = (int)$articleCount['___value___']; //cream subxml-ul unui articol(VALID) $article = '<?xml version="1.0" encoding="ISO-8859-1"?> <article> <title>Titlu articol</title> <author>Autor</author> <date>data</date> <artContent>textul articolului</artContent> </article>'; //cream obiectul articolului $xmlArticle = new xmlParser($article,strlen($article)); $xmlArticleObj = $xmlArticle->XMLToObject(TRUE); //adaugam obiectul articolului la obiectul mama $xmlParser->addNodeXML('root/content/','article',$xmlArticleObj['article']); //updatam article count si salvam noul fisier XML $xmlParser->editNodeXML('root/info/articleCount/',array('___value___'=> (string)++$articleCount)); $newXML = $xmlParser->ObjectToXML(TRUE); $fh = fopen($xmlFile,'w'); fwrite($fh,$newXML,strlen($newXML)); fclose($fh); ?>
2. Creand fiecare nod cu ajutorul clasei XML.
Cea de-a doua metoda se va folosi de functiile aceleasi clase de a adauga noduri XML.Practic vom adauga pe rand fiecare nod, mai intai <article>, urmand <title>, <author>, <date>, <artContent>. 🙂
<?php include('xmlParser.php'); //pregatim fisierul XML pentru procesare $xmlFile = 'fisier.xml'; $xmlContent = file_get_contents($xmlFile); $xmlLength = strlen($xmlContent); //generam obiectul XML $xmlParser = new xmlParser($xmlContent,$xmlLength); $xmlObject = $xmlParser->XMLToObject(TRUE); //preluam numarul de articole $articleCount = $xmlParser->getNodeXML('root/info/articleCount/'); $articleCount = (int)$articleCount['___value___']; //adaugam obiectul articolului la obiectul mama $xmlParser->addNodeXML('root/content/','article',array()); $xmlParser->addNodeXML('root/content/article/','title',array('___value___' => 'Titlu articol'),$articleCount); $xmlParser->addNodeXML('root/content/article/','author',array('___value___' => 'Autor'),$articleCount); $xmlParser->addNodeXML('root/content/article/','date',array('___value___' => 'data'),$articleCount); $xmlParser->addNodeXML('root/content/article/','artcontent',array('___value___' => 'textul articolului'),$articleCount); //updatam article count si salvam noul fisier XML $xmlParser->editNodeXML('root/info/articleCount/',array('___value___'=> (string)++$articleCount)); $newXML = $xmlParser->ObjectToXML(TRUE); $fh = fopen($xmlFile,'w'); fwrite($fh,$newXML,strlen($newXML)); fclose($fh); ?>
Sper ca v-a facut placere sa analizati acest cod si chiar m-as bucura sa vad dezvoltari ale acestuia pentru editare de „articole”, stergerea lor si diverse aplicatii pornind de la asta.Stiu, sunt optimist, insa daca va dori cineva sa invete ar trebui sa se chinuie putin. 🙂
Am uitat sa mentionez ca singurele probleme vor fi intalnite in momentul in care va trebuie sa lucrati cu atribute ale tagurilor,clasa nesuportand acest lucru.Si asa ca datorita acestui articol a suferit foarte multe modificari si retusuri pentru a indeplini cerintele minime acestui subiect.De asemenea, in curand acea clasa se apropie de versiunea finala, inca un salt si va fi gata si va putea fi folosita pe scara larga la orice tip de document XML de orice dimensiune. 🙂
Numai bine! 😀
Daca acest articol contine o greseala, selecteaza cuvintele sau fraza gresita si tasteaza combinatia de taste Shift + Enter sau apasa click aici pentru a o raporta. Multumim!
[…] This post was mentioned on Twitter by Avadanei Andrei, Avadanei Andrei. Avadanei Andrei said: Am terminat inca un articol interesant pentru #programatorii #php Cum sa transformam fisierul XML intr-o baza de date? http://bit.ly/538YUF […]
Salut ,
pentru o aplicatie in c# ce baza de date recomanzi?
aplicatia sa fie portabila
Depinde ce informatii doresti sa stochezi.Eu am folosit in foarte multe aplicatii C# fisiere XML, clasele pentru procesarea lor fiind superb implementate.
De asemenea poti folosi si baze de date ADO.NET sau orice fel de baze de date SQL portabile. 🙂
la Jurnal v2.3.5 Beta imi zici pls ce ai folosit?
scz ca postez aici
Razvan eu ti’as recomanda sa folosesti Microsoft Sql Server sau Mysql ambele fiind solutii, insa daca vrei portabilitate pe alte sisteme fara servere sql foloseste xml.
Acolo am folosit fisiere XML, criptate folosind AES pe 256 biti.
Multumesc pentru postarea acestui articol, ma ajutat foarte mult. 🙂
multumesc
Andrei, bun articol. Am un fisier xml de 30GB , cum il incarc intr-o baza de date?
Problema se pune putin diferit la situatii de genul. Nu am fost niciodata nevoit sa procesez fisiere de asemenea dimensiuni.
Totusi, citirea si interpretarea ar trebui sa fie din mers, stocand cat mai putin in memorie. Practic trebuie sa citesti 8192 de biti (maximul de la fread de exemplu), daca reusesti sa procesezi xml-ul stergi informatia din spate. Aceasta varianta mult de modul in care este structurat fisierul tau. Poate exista si alte metode, dar pentru asta astept alte pareri a celor care s-au confruntat cu problema asta. 🙂