Aide - Recherche - Membres - Calendrier
Version complète : XPath et recherche XML + récupération d'attributs
Forum Développeur - Administration serveur, programmation et base de données > Programmation > XML et XSL
mEga
Salut a tous,
je me lance dans le bain du xml, mais je coince non pas sur du XML en tant que tel mais sur une recherche que j'effectue sur un XML.
J'ai recours a Xpath dans le cadre des fonctions simplexml() de php.
Sur ce que j'ai compris il faut fournir à la méthode xpath de simplexml le masque de recherche.
Mon XML est de la forme suivante
Je souhaite parcourir le XML pour vérifier par exemple si une donnée $var est présente au niveau d'un des attributs label de noeuds , et si c'est le cas de récupérer les attributs label et url.

J'avoue que je suis un peu perdu... si vous aviez des pistes, je les étudierais avec plaisir smile.gif

@+ et d'avance merci
qwix
Tu aurais un exemple avec du vrai contenu ?
C'est pour voir si on peut se passer d'Xpath car si mes souvenirs sont bons, il me semble que c'était assez lent avec simpleXML, on pourrait voir s'il n'y a pas moyen d'utiliser autre chose wink.gif

smile.gif
mEga
voila une partie de fichiers
Xml
<flash label="CSS" open="true">
<o label="Sélecteurs" open="false">
<o dok="selecteur-universel" label="* selecteur-universel" />
<o dok="selecteur-id" label="# : Sélecteur d'id"/>
<o dok="selecteur-classes" label=". : Sélecteur de classes"/>
<o dok="selecteur-type" label="Sélecteur de type"/>
<o dok="selecteur-descendant" label="Sélecteur descendant"/>
<o dok="selecteur-enfants" label="> : Sélecteur d'enfants"/>
<o dok="selecteur-enfants-adjacents" label="+ : Sélecteur d'enfants adjacents"/>
<o dok="selecteur-attributs" label="Sélecteur d'attributs"/>
</o>
mEga
Bon en fait la doc est pas super claire pour mon petit cerveau, et je me suis rendu compte que Xpath n'etait pas utile.
Sans compter que la manière d'utiliser les fonctions simplexml est relativement confuse je trouve, donc j'ai planché sur cette piste pendant 2 jours pour rien smile.gif C'est pas grave j'ai découvert Xpath je n'ai pas complètement perdu mon temps donc smile.gif
liguorien
salut mega smile.gif

je ne dirais pas que les xpath ne sont pas utile dans ce cas-ci. Par contre ça risque de gratter sur le CPU du serveur si le xpath est lourd ou non optimisé..

Sinon, si jamais ton choix reviens sur les xpath, voici une petite recherche xpath qui récupère les node contenant le mot "enfants" dans l'attributs 'dok'

Xml
/flash/o/o[contains(@dok,'enfants')]


(reste à voir si la fonction contains() est implémentée dans l'engin de XPath que tu utilises )

smile.gif
mEga
c'est le moteur de php5... j'ai pas regardé outre mesure...
La question que je me posais en triturant XPath c'est si contains justement n'est pas limitatif...
admettons que tu cherches horizon. Va t il trouver seulement le node horizon mais va t'il trouver le node horizon-essai par exemple
liguorien
la fonction contains() est un peu l'équivalent de faire un indexOf("enfants") > -1, donc oui, le node horizon-essai devrait sortir. Si on veut vérifier la valeur exacte, il faut utiliser l'opérateur d'égalité :

Xml
/flash/o/o[@dok = 'horizon')]

smile.gif
mEga
hin hin ca serait pas mal ca....
mEga
J'ai testé a priori c'est ok, Xpath pour php5 reconnais le modèle que tu m'a indiqué , a moi de récupérer les données qui satisfont le résultat smile.gif
mEga
liguorien (Nov 24 2005, 03:15 PM) a dit :
Sinon, si jamais ton choix reviens sur les xpath, voici une petite recherche xpath qui récupère les node contenant le mot "enfants" dans l'attributs 'dok'

Je te confirme que je suis revenu sur Xpath, et que j'en suis pleinment satisfait.
J'en ai profité pour raccourcir ton pattern

le mien fait //o/o[contains(@label, ma_saisie)] wink.gif
liguorien
il faut faire attention avec l'opérateur //, c'est un peu comme le .* dans un regexp. Ça peut être très gourmant sur les ressources. Bref à utiliser avec précaution wink.gif
mEga
je me demandais si il était possible de recourir a une fonction au sein d'une autre.
style
Code
/flash/o/o[contains(lower-case(@dok),'swapdepths')]
liguorien
En théorie, ça devrait le faire. Il faudrait tester pour le savoir wink.gif
mEga
liguorien (Nov 30 2005, 04:34 PM) a dit :
En théorie, ça devrait le faire.  Il faudrait tester pour le savoir wink.gif
*


Bon le probleme est réglé Xpath dans php5 ne prend pas en charge les fonctions lower_case.. aller aurevoir wink.gif
mEga
Bon je pige pas hier j'ai eu un message d'erreur a propos de lower-case et en retestant ce matin ca passe tranquille mais ca ne rappattrie pas les infos correctement... suis assez perplexe la...
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.