Parcurgerea documentelor XML cu PHP si SimpleXML

Share on:

In ziua de azi se foloseste foarte mult XML, iar probabil cel mai bun exemplu este RSS-ul.

Pe de alta parte o unealta cum este DOM este foarte puternica dar si foarte greoaie. De exemplu daca doresti sa parcurgi un feed RSS nu e tocmai simplu. Aici apare SimpleXML. Acesta este facut in principiu doar pentru parcurgerea de fisiere XML desi are si metode pentru adaugare de elemente.

Citirea unui feed RSS

Primul lucru care trebuie facut este deschiderea fisierului:

 1<?php
 2// adresa unde se afla feed-ul rss
 3$adresa = 'https://blog.claudiupersoiu.ro/feed/';
 4
 5/* incarcarea dintr-un fisier */
 6// procedural
 7$sxe = simplexml_load_file($adresa);
 8
 9// obiectual
10$sxe = new SimpleXMLElement($adresa, null, true);
11
12?>

O data incarcat fisierul XML, obiectul rezultat se poate vedea si folosind var_dump():

1var_dump($sxe);

In acest moment rezultatul va fi:

 1object(SimpleXMLElement)#1 (2) {
 2  ["@attributes"]=>
 3  array(1) {
 4    ["version"]=>
 5    string(3) "2.0"
 6  }
 7  ["channel"]=>
 8  object(SimpleXMLElement)#2 (7) {
 9    ["title"]=>
10    string(15) "Claudiu Persoiu"
11    ["link"]=>
12    string(29) "https://blog.claudiupersoiu.ro"
13    ["description"]=>
14    string(27) "Blog-ul lui Claudiu Persoiu"
15    ["pubDate"]=>
16    string(31) "Mon, 18 May 2009 13:00:13 +0000"
17    ["generator"]=>
18    string(29) "http://wordpress.org/?v=2.7.1"
19    ["language"]=>
20    string(2) "en"
21    ["item"]=>
22    array(10) {
23      [0]=>
24      object(SimpleXMLElement)#3 (7) {
25        ["title"]=>
26        string(47) "Fisiere stocate in baza de date cu PHP si MySQL"
27        ...........................
28        ["pubDate"]=>
29        string(31) "Mon, 18 May 2009 13:00:13 +0000"
30        ["category"]=>
31        array(4) {
32          [0]=>
33          object(SimpleXMLElement)#13 (0) {
34          }
35          [1]=>
36          object(SimpleXMLElement)#14 (0) {
37          }
38          ...........................
39          }
40        }
41        ["guid"]=>
42        string(36) "https://blog.claudiupersoiu.ro/?p=395"
43        ["description"]=>
44        object(SimpleXMLElement)#17 (0) {
45        }
46      }
47      .................................
48    }
49  }
50}

Acum, fiecare element trecut ca obiect are elementele subortonate ca proprietati. Elementele marcate ca array se parcurg ca atare.

De exemplu pentru a accesa titlul primului blog o sa avem:

1echo $xml->channel->item[0]->title;

Si sa zicem ca vrem sa listam ultimele intrari, nu trebuie decat sa parcurgem array-ul items:

1foreach($sxe->channel->item as $item) {
2	echo $item->title.' - '.$item->link.PHP_EOL;
3}

SimpleXML mai are si o metoda de XPath pentru a interoga un document XML. De exemplu sa zicem ca vrem sa cautam intrarile din blog fara sa parcurgem elementele:

1$items = $sxe->xpath('channel/item');
2
3foreach($items as $item) {
4	echo $item->title.' - '.$item->link.PHP_EOL;
5}

Pentru namespace-uri SimpleXML are metodele: getNamespaces care intoarce un array cu NS-urile folosite, getDocNamespaces care intoarce un array cu NS-urile folosite si registerXPathNamespace pentru a creea un prefix la un namespace.

Citirea cursului valutar BNR

Sa luam ca exemlu practic. BNR puna la dispozitie cursul valutar in format XML. Informatiile importante sunt data cursului si cursul Euro.

Primul pas, deschidem fisierul si vedem ce NS-uri sunt folosite:

1// deschidem fisierul XML
2$sxe = new SimpleXMLElement('http://www.bnr.ro/nbrfxrates.xml', null, true);
3
4// extragem NS-urile
5$namespaces = $sxe->getNamespaces(true);
6
7// afisam NS-urile
8var_dump($namespaces);

Pentru a extrage informatiile ca trebuie sa inregistram NS-ul folosit apoi sa realizam interogarile:

 1// conectarea la fisier
 2$sxe = new SimpleXMLElement('http://www.bnr.ro/nbrfxrates.xml', null, true);
 3
 4// inregistrarea NS-ului pentru XPath
 5$sxe->registerXPathNamespace('ns', 'http://www.bnr.ro/xsd');
 6
 7// extragerea cursului Euro,
 8//acesta este un element Rate la care atributul currency are valoarea EUR
 9$EUR = $sxe->xpath('//ns:Rate[@currency="EUR"]');
10
11// afisarea cursului Euro
12echo $EUR[0].PHP_EOL;
13
14// extragerea elementului data
15$Data = $sxe->xpath('//ns:Cube');
16
17// afisarea datei cursului
18echo $Data[0]['date'];

Cam atat, iar acum avem cursul oficial pentru Euro direct de la BNR.