Accedir a XML des de PHP

  • warning: tempnam(): open_basedir restriction in effect. File() is not within the allowed path(s): (/srv/www/gilug.org/www/site.tree/) in /srv/www/gilug.org/www/site.tree/public/includes/file.inc on line 802.
  • warning: fopen(): Filename cannot be empty in /srv/www/gilug.org/www/site.tree/public/includes/file.inc on line 803.
  • El fitxer no s'ha pogut crear.

Aquest petit article intenta demostrar la facilitat amb la qual des de PHP és pot accedir a la informació guardada en format XML utilitzant la nova caraterística de PHP5: simpleXML.



XML és un format estàndard per guardar informació de forma transparent que avui en dia està en boca de tothom. No obstant, els mètodes per accedir a aquesta informació: SAX, DOM i/o XSLT ofereixen una gran potència a expenses d'una complexitat important.



SimpleXML és una característica nova a PHP5 que soluciona la complexitat de parsejar documents XML creant estructures de dades amb les quals es pot iterar con una colecció d'arrays i objectes.


Per provar SimpleXML és necessita una versió de PHP superior a 5.0-beta3 i les llibreries libxml2. Aquestes llibreries es van crear originariament per a GNOME i actualment, degut a la seva gran qualitat, són utilitzades per molts altres projectes.



Fitxer XML d'exemple: RSS




<?xml version="1.0" encoding="utf-8" ?>

<rss version="0.91">


 <channel>

  <title>GiLUG</title>

   <link>http://www.gilug.org</link>

   <description>Girona Linux User Group</description>

 </channel>



 <item>

   <title>Configuració Mozilla Thunderbird</title>

   <link>http://www.gilug.org/?q=node/160</link>

   <description>Descripció</description>

 </item>



 <item>

  <title>Cap al programari lliure a l'administració pública catalana</title>

   <link>http://www.gilug.org/?q=node/159</link>

   <description>Descripció</description>

 </item>



</rss>



Aquest document XML de tipus RSS conté informació dels titulars de www.gilug.org. Ara, utilitzant SimpleXML de PHP accedirem a la seva informació.



El primer pas es carregar el fitxer XML a memòria (parsing):



  $s = simple_xml_load_file('path/al/fitxer.xml');



Si volem accedir al títol del canal:



  print $s->channel->title;



    GiLUG



Per iterar per tots els títols de les notícies:


  foreach ($s->item as item)
     print $item->title





Es mostra el següent contingut:

  • GiLUG
  • Configuració Mozilla Thunderbird
  • Cap al programari lliure a l'administració pública catalana



Per accedir a un atribut d'un TAG:



  $s['version']



    0.91



Consultes amb XPath



XPath és un mecanisme estàndarditzat per W3C per accedir a la unformació dels documents XML. SimpleXML permet el seu ús de forma molt simple.


Per obtenir tots els titulars:



foreach ($s->xsearch('//title') as title)
  print $title . "\n";





El contingut que es mostar és el següent:

  • GiLUG
  • Configuració Mozilla Thunderbird
  • Cap al programari lliure a l'administració pública catalana



Aquest exemple XPath és molt trivial, cal tenir en compte que aquesta tecnologia és molt més complexa i proporciona una gran versatilitat al programador.



SimpelXML també ofereix la possibilitat d'utilitzr 'XML Namespaces' amb XPath i permet editar fitxers XML. És a dir, a partir dels valors de les variables d'un objecte guardar-les amb XML.


Aquesta nova facilitat de PHP obre les portes totalment a què PHP sigui utilitzat com a servidor XML, ja sigui com a generador de PHP o parsejant fixters XML.

Bon article!

I pels que els agradi programar amb C, poden fer una ullada a xmlsoft una llibreria creada per gnome inicialment, però degut a la seva manejavilitat hi ha molts altres projectes que també la fan servir.

SimpleXML utilitza la llibreria que dius

xmlsoft són les llibreries libxml. Siguem que són dos maneres diferents de referir-se al mateix.



Tal com dius, aquestes llibreries són molt utilitzades (dins i fora de GNOME), un dels exemples és l'API SimpleXML de PHP5.


Warning: Table './gilugbitac/accesslog' is marked as crashed and last (automatic?) repair failed query: INSERT INTO accesslog (title, path, url, hostname, uid, sid, timer, timestamp) values('', 'node/161', '', '172.16.8.20', 0, 'tqacs503cjhoh54frmap5t45m5', 11, 1711709367) in /srv/www/gilug.org/www/site.tree/public/includes/database.mysql.inc on line 136