09 mars 2006

[Tuto] XPath et PHP5


Sommaire



  1. Qu'est-ce qu'XPath ?

  2. Comment l'utiliser en PHP5 ?

  3. Comment accéder aux éléments ?

    1. La syntaxe XPath appliquée à la recherche d'éléments


      1. Notation complète :

      2. Notation abrégée :

      3. Arborescence des noeuds :

      4. Désigner plusieurs noeuds à la fois :


    2. La syntaxe XPath appliquée à la recherche d'attributs

    3. La syntaxe XPath appliquée à la recherche de texte


      1. Syntaxe d'un flux RSS 2.0 dans du XML

      2. Exemple : afficher les titres de flux RSS contenant le mot PHP



  4. Sources

  5. En savoir plus





  1. Qu'est-ce qu'XPath ?



    XPath

    est un langage pour désigner une portion d'un document
    XML

    .
    Au départ, XPath a été créé pour uniformiser une syntaxe entre XSL (feuilles de style pour documents XML) et XPointer (désigneurs de documents XML à distance). Donc XPath permet d'accéder précisément à un élément d'un document XML.
    XPath est utilisé par les développeurs comme une syntaxe de tri et de recherche dans les documents XML, grâce à ses expressions régulières. En effet, couplé à un langage de programmation, par les boucles, on peut donc extraire des données précises d'un document XML. Une utilisation, par exemple pourrait être de trier des titres de nouvelles arrivant dans un flux RSS, par un mot-clef.



  2. Comment l'utiliser en PHP5 ?


    En PHP5, les fonctions DOMDocument ont été complétées par l'extension simpleXML qui ajoute une manière simple et orientée objet d'accéder à des arbres DOM, donc à tout document XML, ou XHTML.



  3. Comment accéder aux éléments ?


    Nous nous intéresserons aux noeuds de trois types :




    1. les noeuds d'éléments, c'est-à-dire les balises XML




    2. les noeuds d'attributs, qui ajoutent des informations aux balises




    3. les noeuds de texte, les données du document



    Notez que simpleXML propose déjà des méthodes pour accéder aux éléments et attributs.



    1. La syntaxe XPath appliquée à la recherche d'éléments


      Il existe deux syntaxes pour noter le chemin à travers les éléments du DOM XML : la méthode complète, qui garantit le moins d'erreurs possibles et le plus de précision, et la méthode abrégée qui est plus rapide à écrire.
      Soient des balises, et je veux désigner l'élément c:


      <a>

      <b>

      <c></c>

      <c></c>

      <c></c>

      </b>

      </a>






      1. Notation complète :


        a/child::b/child::c




      2. Notation abrégée :


        a/b/c


        A retenir : on sépare les éléments par un slash, comme les répertoires Unix.
        On sépare les mots-clés de désignation du nom de l'élément par ::





      3. Arborescence des noeuds :


        Pour accéder au noeud racine, on peut utiliser le signe /

        Pour désigner le noeud sur lequel on travaille, on utilise la notation ./


        Pour désigner le noeud parent, on utilise la notation ../





      4. Désigner plusieurs noeuds à la fois :


        Les caractères spéciaux permettent de choisir plusieurs éléments en une seule notation. On utilise l'étoile * comme caractère joker, et // pour outrepasser la désignation de l'arborescence.
        Exemples :
        Soit le XML


        <a>

        <b>

        <c></c>

        <c></c>

        <c></c>

        </b>

        </a>

        <a>

        <b>

        <c></c>

        <c></c>

        <c></c>

        </b>

        </a>

        <a>

        <b>

        <c></c>

        <c></c>

        <c></c>

        </b>

        <c></c>

        <c></c>

        </a>

        Je désigne tous les noeuds enfants de a par a/* (je récupère donc les noeuds b et c).


        Je désigne tous les c contenus dans un élément b par b//c, si je souhaite au contraire tous les éléments c
        quel que soit le noeud parent, je ferais //c
        Attention, on postule que la DTD autorise des éléments c
        qui ne seraient pas dans <b>
        On peut également combiner les choix dans les fonctions par le caractère | (pipe).



    2. La syntaxe XPath appliquée à la recherche d'attributs


      La notation longue des attributs se fait par le mot clef attribute, et la notation abrégée par le caractère @.


      <personne>

      <yeux couleur ="bleu">

      </yeux>

      <cheveux couleur="blond">longs</cheveux>

      </personne>

      <personne>

      <yeux couleur ="gris">

      </yeux>

      <cheveux couleur="blond">en brosse</cheveux>

      </personne>

      <personne>

      <yeux couleur ="brun">

      </yeux>

      <cheveux couleur="noir">courts</cheveux>

      </personne>

      Pour désigner les attributs de couleurs d'yeux, je note :


      /child::personne/child::yeux/attribute::couleur (complète)
      /personne/yeux/@couleur (abrégée)




    3. La syntaxe XPath appliquée à la recherche de texte


      On utilise la fonction contains(chaine, motif). Depuis PHP, notre chaîne sera le titre de la nouvelle qu'on souhaite examiner. On peut examiner aussi bien les noeuds que leurs attributs, que le texte contenu dans le noeud élément.




      Syntaxe d'un flux RSS 2.0 dans du XML



      <rss version="2.0">

      <channel>

      <title>Titre du channel</title>

      <link>http://www.monsite.com</link>

      <description>Description du channel</description>

      items...

      </channel>

      </rss>




      Exemple : afficher les titres de flux RSS contenant le mot PHP



      //On spécifie les sources RSS

      $tablo_flux[0] = 'http://afup.org/backend.php3';

      $tablo_flux[1] = 'http://www.nexen.net/index2.php?option=com_rss&feed=RSS0.91&no_html=1';

      $tablo_flux[2] = 'http://news.google.fr/news?oe=utf-8&client=firefox-a&rls=org.mozilla:fr:official&tab=dn&ned=fr&topic=t&output=rss';



      // Nous connaissons l'arborescence de ces flux, car c'est spécifié

      for($i=0;$i < count($tablo_flux);$i++)

      {

      $racine[$i] = simplexml_load_file($tablo_flux[$i]);

      //sensible à la casse

      $recherche = '/rss/channel/item[contains(title,"PHP")]/title';

      $titres = $racine[$i]->xpath($recherche);

      // Quand il n'y a pas de résultat, $titres vaut FALSE

      if($titres)

      {

      foreach($titres as $actu)

      {

      echo '<a href="'.htmlentities((string)$actu->link).'">'.utf8_decode($actu)."</a><br />";

      }

      }

      }





  4. Sources



    http://fr.wikipedia.org/wiki/XPath


    http://xmlfr.org/w3c/TR/xpath/


    http://www.w3.org/TR/xpath20/


    http://fr.selfhtml.org/xml/representation/syntaxexpath.htm


    http://jerome.developpez.com/xmlxsl/xpath/?lpage=&rpage=1


    http://www.oreilly.com/catalog/xmlnut/chapter/ch09.html


    http://www.stervinou.com/projets/rss/




  5. En savoir plus


    Article de Wikipedia sur Xpath

    http://fr.wikipedia.org/wiki/XPath

    Norme du W3C sur XPath

    http://www.w3.org/TR/xpath

    Manuel PHP sur SimpleXML

    http://fr2.php.net/manual/fr/ref.simplexml.php


    Extrait d'un ouvrage O'Reilly (XML in a Nutshell
    By Elliotte Rusty Harold & W. Scott Means

    )

    http://www.oreilly.com/catalog/xmlnut/chapter/ch09.html

    Les fonctions Xpath
    http://fr.selfhtml.org/xml/representation/fonctionsxpath.htm

    Former des flux RSS 2.0 http://ghostdogpr.developpez.com/articles/rss/

Libellés : , , , ,

[poster sur Del.icio.us]