0

XPath Parser pour PHP

| 04 novembre 2009
| Plus

Générer un arbre syntaxique pour XPath

Mon but est de transformer une expression XPath en Arbre Syntaxique. Une petite recherche sur Internet et je trouve le projet ANTLR. Celui ci propose deux grammaires pour XPath. Il existe également un générateur de code PHP. Super ! En s'intéressant un peu à ce "runtime", j'ai l'impression d'avoir trouvé une masse pour enfoncer ma pointe... J'abandonne.
Quelque requêtes infructueuses Google plus loin, je décide d'écrire mon propre bout de code :

Un package PEAR XPath_Parser

Alors autant le dire tout de suite, ce paquet n'est pas encore capable d'analyser une grammaire XPath complète. Cela viendra peut-être un jour mais pour le moment il comprend uniquement une grammaire XPath simplifiée. Voici donc sa description rapide en BNF


    <location>   ::= [ <axis> [ <position> | [ <conditions> ] * ] ] +
    <axis>       ::= [ "child::" | "/" | "attribute::" | "@" | "parent::" | "../" | "self::" | "./" | "descendant-or-self::" | "//" ] [ <char> ] +
    <position>   ::= "[" [ <integer> ] + "]"
    <conditions> ::= "[" <condition> [ <logical> <condition> ] * "]"
    <condition>  ::= <location> <operator> <value>
    <operator>   ::= [ "or" | "and" ]
    <value>      ::= [ [ <interger> ] + | [ <char> ] + ]
    <integer>    ::= '0' - '9'
    <char>       ::= 'a' - 'Z'

Simple ne veut pas dire minimum, cette grammaire est plus riche que la grammaire MicroXPath

Usage et fonctions

Dans sa version 1.0, ce paquet permet juste de transformer une chaine XPath en tableau.


$o = new XPath_Parser("/a[@b='1']/c[@b='2' and child::e='3']//d[@b='4']");
$t = $o->getArray();

Le tableau produit par l'exemple précédent ressemblera à celui ci :
            array(
                array (
                    'axis' => 'child',
                    'localName' => 'a',
                    'condition' => array(
                        array(
                            'location' => array (
                                array (
                                    'axis' => 'attribute',
                                    'localName' => 'b',
                                ),
                            ),
                            'operator' => '=',
                            'literal' => '1',
                        )
                    ),
                ),
                array (
                    'axis' => 'child',
                    'localName' => 'c',
                    'condition' => array(
                        array(
                            'location' => array (
                                array (
                                    'axis' => 'attribute',
                                    'localName' => 'b',
                                ),
                            ),
                            'operator' => '=',
                            'literal' => '2',
                        ),
                        array(
                            'location' => array (
                                array (
                                    'axis' => 'child',
                                    'localName' => 'e',
                                ),
                            ),
                            'operator' => '=',
                            'literal' => '3',
                        )
                    ),
                ),
                array (
                    'axis' => 'descendant-or-self',
                    'localName' => 'd',
                    'condition' => array(
                        array(
                            'location' => array (
                                array (
                                    'axis' => 'attribute',
                                    'localName' => 'b',
                                ),
                            ),
                            'operator' => '=',
                            'literal' => '4',
                        )
                    ),
                ),
            )

D'autres exemples sont disponibles dans le fichier des tests unitaires.

Téléchargement et code source

Le paquet est disponible via le channel pear du projet Pxxo :


% pear channel-discover pear.pxxo.net
% pear install pxxo/XPath_Parser

Le code source est disponible sur GitHub.

0

Votre bloc-notes, vos pense-bêtes, vos idées stockées et accessibles à tout moment, partout sur Internet

| 16 octobre 2009
| Plus

Un billet pour parler d'un nouveau site web : http://www.notules.net
Vu le nom de domaine, on comprend que ce site contient des notules.

Mais qu'est-ce-qu'une notule ?

Le terme notule vient du latin "notula" qui veut dire "petite note". Le dictionnaire Larousse donne comme définition :

«Courte annotation à un texte ou court exposé sur une question.» Le Larousse

Le Litré, quant à lui, indique :

«Petite note ; ne se dit qu'en parlant de courtes annotations mises à un texte ancien» Le Litré

Mais que propose ce site www.notules.net ?

Et bien, c'est tout simple : à partir d'une adresse électronique, on crée une page dans laquelle on peut écrire de petits textes, des petites notes, de courts exposés. En fait, on y écrit des notules !

Quels intérêts ?

A cette question, chaque internaute aura un avis différent, mais on peut quand même en lister quelques uns :

  • à rien : ce site ne sert strictement à rien.
  • à ne pas oublier des idées que l'on risque justement d'oublier si on ne les note pas quelque part.
  • à stocker ses notes personnelles concernant par exemple des sites web, des livres, des CD ou tout objet virtuel ou non que l'on possède ou rencontre.
  • à recenser de manière rapide les éléments de sa collection de livre, de disque, de bouteilles de vin, etc ...
  • à publier des textes sur Internet d'une manière simple, rapide, gratuite et originale.

Quel avantage ?

  • la simplicité, voir même un coté simpliste.
  • l'anonymat. Certes l'enregistrement nécessite un courriel, mais c'est la seule information personnelle à fournir, et à aucun moment, ce courriel n'apparaît sur la page Internet qui lui est associée.
  • la confidentialité. Les pages créées ne sont connues que de leur créateur. Il est quasiment impossible de deviner l'adresse d'une page sur le site. Bien sûr, chaque propriétaire est libre de diffuser l'adresse de sa page, mais cela relève de sa seule responsabilité.
  • la gratuité. Le service fourni est gratuit et tente de se financer avec un peu de publicité.

Quel inconvénient ?

Le site est jeune, le nombre de fonctionnalité est (volontairement) limitée, les internautes exigeants lui trouveront sûrement beaucoup de défaut...