IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

Comment récupérer le texte d'un noeud selon son attribut ?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 23
    Points
    23
    Par défaut Comment récupérer le texte d'un noeud selon son attribut ?
    Bonjour, avec mes seules recherches depuis 2jours, l'indice TIOBE de Xpath a surement pris plusieurs %, au final j’atterris qd mm ici
    je dois partir du XML suivant :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <data number="5883" user="001" order="5883">
    [...]
    </data>
    <data number="5884" user="001" order="5884">
    	<column>
    		<parameter name="idcompte" type="cdata"><![CDATA[132]]></parameter>
    		<parameter name="nomachat" type="cdata"><![CDATA[solde 2014]]></parameter>
    		<parameter name="date" type="cdata"><![CDATA[2014-10-14]]></parameter>
    		<parameter name="qte" type="cdata"><![CDATA[1]]></parameter>
    		<parameter name="puht" type="cdata"><![CDATA[1002.86]]></parameter>
    		<parameter name="idtva" type="cdata"><![CDATA[001]]></parameter>
    		<parameter name="paye" type="string">1</parameter>
    		<parameter name="idfourn" type="cdata"><![CDATA[098]]></parameter>
    		<parameter name="idcat" type="cdata"><![CDATA[001]]></parameter>
    		<parameter name="idclassif" type="cdata"><![CDATA[0]]></parameter>
    	</column>
    </data>
    [...etc.]
    dans ma fonction le PHP commence par :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
     $xml = simplexml_load_file($plgDatas.$q["table"].'.xml');
    et je vous liste ci-dessous mes syntaxes de filtrage testées au fil de mes lectures
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if ($q["id"]!="") {$xml = $xml->xpath('//data[@number='.$q["id"].' ] '); unset($q); } #OK
    if ($q["limit"]!="") {$xml = $xml->xpath('//data[position()<='.$q["limit"].']'); } #OK
     
    //if ($q['compt']!="") {$result= $xml->xpath('//parameter[@name="idcompte" and text()="'.$q["compt"].'"] '); } #OK 7 result mais que les attributs
    //if ($q['compt']!="") {$result= $xml->xpath('//column[parameter[@name="idcompte" and .="'.$q["compt"].'"]]'); } #OK 7 result mais que les attributs
    //if ($q['compt']!="") {$result= $xml->xpath('//parameter[@name="idcompte"]/text()="'.$q["compt"].'" '); } #non
    if ($q['compt']!="") {$result= $xml->xpath('//parameter[@name="idcompte"]/../parameter[text()="'.$q["compt"].'"]'); } #OK 7 result mais que attributs
    // if ($q['compt']!="") {$xml = $xml->xpath('//parameter[contains(text(),"'.$q["compt"].'")] ');} // nawack
    Dans le meilleur des cas mon tableau $result contient uniquement les attributs des 7 résultats voulus...sans les datas.
    Bref, je tente désespérément d'obtenir l'équivalent d'un SELECT idfourn FROM datas WHERE idfourn = $q['compt'] en SQL,
    soit en français, tous les noeuds <data> contenant le noeud(petit-fils)<parameter> contenant l'attribut "idfourn" et dont la valeur du noeud soit $q['compt']
    Par avance un millier de mercis.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    Si tu veux un <data>, déjà tu peux être sûr qu'il faut demander un <data>. C'est pour ça que les deux premiers marchent et pas les suivants.

    Ensuite, pour déterminer lesquels tu veux garder, dans la grande liste de tous les <data>, ça c'est du filtrage, c'est dans ce qu'on appelle le prédicat, entre [ et ].
    À gauche de ce prédicat, se trouve ce que tu demandes à avoir. Dans le prédicat, se trouvent les trucs à regarder pour décider si on garde ou on jette.

    Le petit problème donc, c'est que ce que tu cherches, c'est un petit-fils <parameter> qui répond à deux conditions.
    Donc, entre les [ et ] du data, tu dois sélectionner les <parameter> petit-fils de ce <data>, et eux-même vérifier s'il répond aux conditions. Une condition dans une condition.

    Donc, //data[chose/bidule[@machin = 'truc' and . = 'chouette']] ...

    Le . signifie "l'élément dont on est en train de vérifier la condition", et quand on le compare à une string, ça prend simplement son contenu texte. Là ça va sélectionner la même chose qu'en mettant text() à la place, mais souvent on met juste le . car avec l'habitude ça a l'air plus clair.

    Si tu te dis, "mais je comprends pas, c'est pas un truc vrai/faux qu'on met dans la première condition, chose/bidule[@machin = 'truc' and . = 'chouette'], c'est une sélection d'éléments <bidule> !"
    En XPath toutes les expressions peuvent être considérées comme vraies ou fausses. Dans le cas d'une sélection d'éléments, elle est vraie si l'élément demandé existe. Sinon, elle est fausse.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    je languis demain de potasser ça !
    merci pour ces explications, plus claires que bien des tutos souvent limités aux exemples de base...comme ma requête pourtant.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    désolé mais la logique m'échappe encore :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # tentatives de reculer à la balise de l'attribut
    if ($q['compt']!="") {$xml = $xml->xpath('//data[column/parameter[@name="idcompte"]/../parameter[text()="'.$q["compt"].'"] ');} 
    if ($q['compt']!="") {$xml = $xml->xpath('//data[column/parameter[@name="idcompte"]../parameter[text()="'.$q["compt"].'"] ]');}
    if ($q['compt']!="") {$xml = $xml->xpath('//data[column/parameter[@name="idcompte" and ../parameter[text()="'.$q["compt"].'"]] ]');}
     
    # j'imagine que des conditions réunies dans le mm prédicat analysent la même "branche" de l'arbre ?
    if ($q['compt']!="") {$xml = $xml->xpath('//data[column/parameter[@name="idcompte" and .="'.$q["compt"].'"]] ');}
    if ($q['compt']!="") {$xml = $xml->xpath('//data[column/parameter[@name="idcompte" and contains(text(),"'.$q["compt"].'")] ]');} // contains() se comporte comme un strpos($q["compt"],@name) ?
     
    # pourtant si je sors du prédicat initial ça marche pas
    if ($q['compt']!="") {$xml = $xml->xpath('//data[column/parameter[@name="idcompte"]/text()="'.$q["compt"].'" ]');}
    if ($q['compt']!="") {$xml = $xml->xpath('//data[column/parameter[@name="idcompte"].="'.$q["compt"].'" ]');}
    if ($q['compt']!="") {$xml = $xml->xpath('//data[column/parameter[@name="idcompte"] and column/parameter/text()="'.$q["compt"].'" ]');}
    mes excuses si la syntaxe pique les yeux ^^
    je pressens un potentiel énorme pour combiner des filtres (à base de [1=1 and..and...]) mais je bute sur la syntaxe initiale

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Personnellement je comprends pas tes questions.
    Tu arrives à te servir de mon exemple ou pas ? je vois que tu inventes beaucoup de syntaxes mais à partir du moment où tu arrives à utiliser mon exemple, je ne vois pas à quoi ça te sert d'essayer d'autres syntaxes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    ton exemple m'a surtout servi à comprendre que la requete doit partir du /root pour retrouver ce qui en découle dans le tableau, désolé.
    dans
    Code xpath : Sélectionner tout - Visualiser dans une fenêtre à part
    //data[chose/bidule[@machin = 'truc' and . = 'chouette']]
    chouette est censé être le text() de bidule pourtant
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    ->xpath('//data[column/parameter[@name="idcompte" and .="'.$q["compt"].'" ] ]');
    ne me renvoie rien d'où mes interrogations

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Pour tout ce qui est syntaxe PHP je ne peux pas t'aider, désolé. Ces lignes que tu me montres me semblent être un langage ésotérique et me rappellent combien j'aime le doux String.format() de mon Java chéri.

    Pour ce qui est pure syntaxe XPath, par contre, je suis affirmatif que ça devrait marcher.
    Si nous prenons ce document XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <data number="5884" user="001" order="5884">
    	<column>
    		<parameter name="idcompte" type="cdata"><![CDATA[132]]></parameter>
    		<parameter name="nomachat" type="cdata"><![CDATA[solde 2014]]></parameter>
    		<parameter name="date" type="cdata"><![CDATA[2014-10-14]]></parameter>
    		<parameter name="qte" type="cdata"><![CDATA[1]]></parameter>
    		<parameter name="puht" type="cdata"><![CDATA[1002.86]]></parameter>
    		<parameter name="idtva" type="cdata"><![CDATA[001]]></parameter>
    		<parameter name="paye" type="string">1</parameter>
    		<parameter name="idfourn" type="cdata"><![CDATA[098]]></parameter>
    		<parameter name="idcat" type="cdata"><![CDATA[001]]></parameter>
    		<parameter name="idclassif" type="cdata"><![CDATA[0]]></parameter>
    	</column>
    </data>
    et que nous y appliquons ce XPath :
    Code XPath : Sélectionner tout - Visualiser dans une fenêtre à part
    //data[column/parameter[@name="idcompte" and . = "132"]]

    On obtient bien l'élément <data> demandé et aucun autre (en essayant de faire varier les valeurs.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Ma débauche de mauvaises syntaxes ont plus montré mon ignorance de xpath qu'à témoigner de mes efforts avant de poster ici
    Je m'aplatis en excuses : ma valeur de départ était foireuse (select non actualisé entre deux F5, j'en retiens qu'il faut faire les tests avec des valeurs en "dur")
    Je vais faire un tour sur le forum php voir si je peux racheter ce temps perdu sur mon cas.
    Encore merci et bonne journée.

  9. #9
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    Thelvin,
    Merci pour l'explication du 16/12 18h13

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM XML] Récupérer la valeur d'un tagname selon son attribut
    Par nkordiko dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 11/04/2012, 11h04
  2. Réponses: 2
    Dernier message: 25/08/2006, 14h06
  3. Réponses: 3
    Dernier message: 11/05/2006, 17h47
  4. [C# 1.1] Comment récupérer du texte entre des mots connus ?
    Par foolsky dans le forum Windows Mobile
    Réponses: 8
    Dernier message: 26/04/2006, 14h15
  5. comment récupérer du texte formatté
    Par david06600 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 20/02/2006, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo