Parsovanie XML súboru v PHP

XML je dnes už relatívne rozšírená forma sprístupňovania dynamicky generovaného obsahu pre externých partnerov. Každý väčší aj menší web má napríklad svoje RSS, čo je tiež XML formátovaný súbor. Pomocou vhodne vygenerovaného XML feedu dokážeme napríklad zobraziť spravodajstvo tlačovej agentúry, najnovšie ponuky pracovného portálu či aktuálnu ponuku autobazáru. Všetko samozrejme presne napasované do nášho dizajnu. Princíp je jednoduchý – všetok takýto externý obsah sa naťahuje z dynamicky generovaného XML súboru, ktorý je aktualizovaný zo strany poskytovateľa služby.

Ako príklad si zoberme RSS feed tlačovej agentúry SITA. Na stránke http://www.webnoviny.sk/…-Kanaly.html nájdeme zoznam všetkých feedov, ktoré SITA ponúka, majú ich prehľadne rozčlenené do mnohých kategórií.
Základom parsovania jednoduchých XML súborov, akými RSS feedy sú, je PHP funkcia simplexml_load_fi­le.

<?
 
$request_url = "http://www.webnoviny.sk/rss/iwebnoviny7.rss"; // adresa xml súboru
$xml = simplexml_load_file($request_url) or die("feed sa nepodarilo načítať");
 
?>

Pokiaľ je všetko tak ako má byť, zdrojový súbor sa našiel a jeho štruktúra je taká, že ju PHP načíta, k premennej $xml môžeme pristupovať ako k objektu, v ktorom sú uložené jednotlivé vetvy XML súboru. Pre lepšie pochopenie uvádzam časť výpisu premennej prostredníctvom var_dump:

<?
// var_dump($xml);
 
object(SimpleXMLElement)#1 (2) {
  ["@attributes"]=>
  array(1) {
    ["version"]=>
    string(3) "2.0"
  }
  ["channel"]=>
  object(SimpleXMLElement)#2 (6) {
    ["title"]=>
    string(24) "Webnoviny.sk - Auto-moto"
    ["link"]=>
    string(24) "http://www.webnoviny.sk/"
    ["description"]=>
    string(26) "Spravodajský portál SITA"
    ["language"]=>
    string(2) "sk"
    ["docs"]=>
    string(31) "http://backend.userland.com/rss"
    ["item"]=>
    array(15) {
      [0]=>
      object(SimpleXMLElement)#3 (8) {
        ["title"]=>
        string(66) "Auto-moto: Ceny diaľničných známok pre autá sa nebudú meniť"
        ["link"]=>
        string(100) "http://www.webnoviny.sk/auto-moto/clanok/24012/Ceny-dialnicnych-znamok-pre-auta-sa-nebudu-menit.html"
        ["description"]=>
        string(397) "Ceny diaľničných známok pre motorové vozidlá do 3,5 tony sa nebudú v budúcom roku meniť. Ako vyplýva z nariadenia vlády, ktoré ministri na stredajšom rokovaní kabinetu schválili, dvojstopové motorové vozidlá alebo jazdné súpravy s celkovou hmotnosťou do 3,5 tona zaplatia za užívanie vymedzených úsekov diaľnic a ciest pre motorové vozidlá ročne 36,5 eur (1 099,6 Sk)."
        ["category"]=>
        string(9) "Auto-moto"
        ["author"]=>
        string(12) "Webnoviny.sk"
        ["comments"]=>
        string(100) "http://www.webnoviny.sk/auto-moto/clanok/24012/Ceny-dialnicnych-znamok-pre-auta-sa-nebudu-menit.html"
        ["enclosure"]=>
        object(SimpleXMLElement)#18 (1) {
          ["@attributes"]=>
          array(3) {
            ["url"]=>
            string(46) "http://www.webnoviny.sk/uploady/dialnica-9.jpg"
            ["lenght"]=>
            string(5) "30273"
            ["type"]=>
            string(10) "image/jpeg"
          }
        }
        ["pubDate"]=>
        string(31) "Wed, 29 Oct 2008 19:35:00 +0100"
      }

Pokiaľ by sme chceli získať výpis všetkých aktuálnych správ uvedených v RSS feede, budeme iterovať cez pole $xml->channel->item, ktoré v hierarchii XML feedu predstavuje jednu novinku. K jednotlivým prvkom poľa potom pristupujeme tak, ako vidno na príklade. Je dobré, či skôr nutné, nechať si vždy vypísať štruktúru načítaného súboru prostredníctvom var_dump, aby sme vedeli, k akým prvkom sa dá pristupovať.

foreach($xml->channel->item as $key) {
 
     echo $key->title .'<br />'; // vypíše titulok
     echo $key->link .'<br />'; // vypíše linku na celý článok
     echo $key->enclosure['url'] .'<br />'; // vypíše adresu obrázku k článku
     echo $key->description .'<br />'; // vypíše perex článku
 
}

Parsovanie XMLka nie je nič náročné, pokiaľ je súbor korektne vygenerovaný a má správnu štruktúru. Vďaka feedom sa weby dajú obohatiť o množstvo aktualizovaných informácií z externých zdroj – pozor však aj na autorské práva!