PHP & MySQL

Lire un XML en PHP5

Le 15 octobre 2007 à 22:09 par Tomtom

Aujourd’hui, le XML est un format incontournable sur le web. Toutes les API des services web2.0 renvoient des fichiers XML contenant les résultats de la requête. Il est donc vital de savoir correctement lire un fichier XML. Nous allons donc faire ça en utilisant des fonctionnalités native dans PHP5 : SimpleXML Heureusement pour nous, PHP5 a grandement simplifié la lecture d’un fichier XML par rapport à PHP4, c’est donc avec ces nouvelles fonctions que je vais travailler. Imaginons donc que l’on veuille lire un fichier comme ceci :

  1. <?xml version="1.0" encoding="windows-1250"?>
  2. <famille nom="SmashingCoding">
  3. <membres>
  4. <membre nom="Chris" type="fondateur" />
  5. <membre nom="Tom" type="contributeur" />
  6. <membre nom="Gérald" type="contributeur" />
  7. <membre nom="Nicolas" type="contributeur" />
  8. <membre nom="Tomtom" type="contributeur" />
  9. </membres>
  10. <competences>
  11. <competence nom="PHP" membre="Tomtom" />
  12. <competence nom="MySQL" membre="Chris" />
  13. <competence nom="CSS" membre="Tom" />
  14. <competence nom="Ajax" membre="Tomtom" />
  15. <competence nom="XHTML" membre="Gérald" />
  16. <competence nom="Référencement" membre="Gérald" />
  17. <competence nom="Ajax" membre="Nicolas" />
  18. </competences>
  19. </famille>

On commence donc par ouvrir le fichier XML :

  1. # On peut remplacer fichier.xml par une URL
  2. $file = ‘fichier.xml’;
  3. # On initialise l’objet $xml
  4. $xml = simplexml_load_file($file);

A partir de là, on a fait le plus dur. Il ne reste plus qu’a parcourir le fichier. La syntaxe est très simple à retenir :

  1. # Atteindre le noeud ‘nom_du_noeud’
  2. $xml->nom_du_noeud;
  3. # Atteindre le noeud fils ‘nom_du_noeud2′ du noeud père ‘nom_du_noeud1′
  4. $xml->nom_du_noeud1->nom_du_noeud2;
  5. # Lire l’attribut ‘titre_attribut’ du noeud ‘nom_du_noeud’
  6. $xml->nom_du_noeud[‘titre_attribut’];

Imaginons que l’on veuille par exemple récupérer la liste des membres de la famille SmashingCoding:

  1. echo ‘<p>Liste des membres :</p><ul>’;
  2. foreach($xml->famille->membres->membre as $membre) {
  3. echo ‘<li>’.$membre[‘nom’].‘ est membre et ‘.$membre[‘type’].‘ de la famille ‘.$xml->famille[‘nom’].‘</li>’;
  4. }
  5. echo ‘</ul>’;

Ce qui affichera :

Liste des membres :
  • Chris est membre et fondateur de la famille SmashingCoding
  • Tom est membre et contributeur de la famille SmashingCoding
  • Gérald est membre et contributeur de la famille SmashingCoding
  • Nicolas est membre et contributeur de la famille SmashingCoding
  • Tomtom est membre et contributeur de la famille SmashingCoding

Mais on peut aller plus loin. Imaginons que l’on veuille maintenant récupérer la liste des compétences par utilisateur :

  1. echo ‘<p>Liste des membres :</p><ul>’;
  2. foreach($xml->famille->membres->membre as $membre) {
  3. $res = ;
  4. foreach($xml->famille->competences->competence as $competence) {
  5. if($competence[‘membre’] == $membre[‘nom’]) $res .= $competence[‘nom’].‘ ‘;
  6. }
  7. $item = ‘<li>’.$membre[‘nom’].‘ est membre et ‘.$membre[‘type’].‘ de la famille ‘.$xml->famille[‘nom’].‘ %s</li>’;
  8. echo (emtpy($res)) : sprintf($item,‘(Aucune compétence)’) ? sprintf($item,‘(’.$res.‘)’);
  9. }
  10. echo ‘</ul>’;

On obtiendra donc :

Liste des membres :
  • Chris est membre et fondateur de la famille SmashingCoding (MySQL)
  • Tom est membre et contributeur de la famille SmashingCoding (CSS)
  • Gérald est membre et contributeur de la famille SmashingCoding (XHTML Référencement)
  • Nicolas est membre et contributeur de la famille SmashingCoding (Ajax)
  • Tomtom est membre et contributeur de la famille SmashingCoding (PHP Ajax)

Finger in the nose! Maitenant, vous aussi vous pouvez faire joujou avec les API

4 commentaires »

Gravatar

Commentaire de ufunk

le 17 janvier 2008 à 17:46

salut !
bon tuto, mais en fait j’arrive pas à le faire marcher…
je fait bien un fichier XML et mon php est sensé le lire (il se charge bien avec le simplexml_load_file)

mais il me fait une reeur sur le foreach :

foreach($xml->famille->membres->membre as $membre)

il me renvoi un
invalid argument supplied for foreach()

en faisant un print_r juste avant je voit bien que mon fichier est xml est chargé et j’ai vraiment pris celui de l’exemple…
donc je comprend pas… une piste ?

merci d’avance !

Gravatar

Commentaire de ufunk

le 17 janvier 2008 à 18:39

c’est marrant il me semblait avoir laissé un commentaire ici …. :/

Gravatar

Commentaire de Tomtom

le 17 janvier 2008 à 20:55

Et doucement! Je suis pas dispo en permanence, c’est pas un self-service!

Sinon, pour ton problème comme ça je vois pas. En même temps sans le code du script + celui du xml, ça va être un peu dur de t’aider mais vérifie que tu ne t’ai pas trompé dans les noms avec les “s” ou non

Gravatar

Commentaire de ufunk

le 18 janvier 2008 à 11:30

salut !
désolé pour le deuxième message, je l’ai ecrit parce que je voyais plus mon premier commentaire… (en aucun cas je ne me permettrai de raler dans l’attente d’une réponse ;) ça serait pas très courbertin)

je pense avoir trouvé, d’après moi :

$xml->famille->membres->membre as $membre

devrait etre écrit

$xml->membres->membre as $membre

puisqu’apparement famille est considéré comme la racine du xml.

voilà !

Laisser un commentaire

Votre Nom

Votre E-mail (obligatoire mais ne sera pas publié)

Votre Site ou blog

Votre commentaire

Valid XHTML 1.0 Transitional