Processare XML con PHP 5

Accedere ai normali nodi di un listato XML è molto semplice con le funzioni SimpleXML (vedi anche su W3schools) di PHP 5. Tuttavia, può nascere qualche perplessità quando ci si trova in presenza di namespace e nomi di nodi in cui vi siano trattini (“-“), in inglese hyphens.
Vediamo, allora, come accedere ai nodi nei tre casi più comuni.

Supponiamo di avere un qualsiasi file XML, come un normale feed. Con PHP 5 si accede ai nodi con una semplicità disarmante:

$url = "http://www.esempio.com/file.xml";
$xml = simplexml_load_file($url);

In alcuni casi, potrebbe essere necessario ricorrere alla libreria cURL:

$url = "http://www.esempio.com/file.xml";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
curl_close($ch);
$xml = simplexml_load_string($result);

In questo caso è stato chiesto il listato XML sottoforma di stringa di testo. Come si nota, si accede ai nodi con la funzione simplexml_load_string(), e non con simplexml_load_file(), come nell’esempio precedente.

Ok. Ora abbiamo l’oggetto $xml e accederemo ai nodi e ai relativi attributi con un normale ciclo floreach():

foreach($xml->item as $item){
  $title = $item->title;
  $attrib = $title['attribute'];
}

Che succede quando ci si trova in presenza di namespace? Prima di tutto, va cercato l’elemento root del blocco XML, e l’attributo xmlns con cui viene dichiarato il namespace (si noti che il browser normalmente non accederà alla risorsa indicata, ma ne terrà conto solo come riferimento univoco al namespace).

Facciamo un esempio, prendendo a riferimento un feed generato da FeedBurner. L’elemento root è <rss>:

<rss xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  xmlns:media="http://search.yahoo.com/mrss/" version="2.0">

Se volessimo l’autore di un post, all’interno del nodo item dovremmo cercare il nodo <dc:creator>:

<dc:creator>carlodaniele</dc:creator>

Non rimane che accedere ai nodi con solito ciclo foreach():

foreach($xml->item as $item){
  $dc = $item->children("http://purl.org/dc/elements/1.1/");
  $creator = $dc->creator;
}

La differenza rispetto all’esempio precedente è che abbiamo fatto ricorso al metodo children(), passando come argomento la URI della dichiarazione precedente. A questo punto si può accedere ai nodi come nel primo esempio.

Infine, i nodi con gli hyphen. In realtà, non è frequente incontrare i trattini nei nomi dei nodi… ma può succedere. Nelle risposte dell’API di Tumblr, ad esempio, vi sono un mucchio di trattini…

Il ciclo foreach() è sempre lo stesso. In realtà, cambia ben poco: bisognerà solo ricorrere a parentesi graffe e virgolette (o apostrofi):

foreach($xml->posts->post as $post){
  $caption = $post->{'photo-caption'};
}
Annunci

2 thoughts on “Processare XML con PHP 5

  1. grazie carlodaniele, era da mo che lo stavo cercando!
    finalmente una spiegazione chiara ed esaustiva!
    complimenti!

I commenti sono chiusi.