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

Langage PHP Discussion :

Utilisation de Xpath


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2012
    Messages : 142
    Par défaut Utilisation de Xpath
    Bonjour à tous,

    J'ai un soucis pour récupérer un simple noeud.

    Voici le xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <query yahoo:count="1" yahoo:created="2016-06-20T09:29:00Z" yahoo:lang="fr"><results><place xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/580778"><woeid>580778</woeid><placeTypeName code="7">Town</placeTypeName><name>Bordeaux</name><country code="FR" type="Country" woeid="23424819">France</country><admin1 code="" type="Region" woeid="7153309">Aquitaine</admin1><admin2 code="" type="Department" woeid="12597132">Gironde</admin2><admin3/><locality1 type="Town" woeid="580778">Bordeaux</locality1><locality2/><postal/><centroid></centroid><boundingBox></boundingBox><areaRank>1</areaRank><popRank>1</popRank><timezone type="Time Zone" woeid="28350911">Europe/Paris</timezone></place></results></query><!-- total: 10 -->
    <!-- main-2322b281-1df8-11e6-a4df-d4ae52974c31 -->
    Si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $weather_xml = simplexml_load_string($weather_string);
    $woeid = $weather_xml->xpath('results');
    var_dump($woeid);
    Je récupère
    Code : 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
     
    array(1) {
      [0]=>
      object(SimpleXMLElement)#10 (1) {
        ["place"]=>
        object(SimpleXMLElement)#11 (15) {
          ["woeid"]=>
          string(6) "580778"
          ["placeTypeName"]=>
          string(4) "Town"
          ["name"]=>
          string(8) "Bordeaux"
          ["country"]=>
          string(6) "France"
          ["admin1"]=>
          string(9) "Aquitaine"
          ["admin2"]=>
          string(7) "Gironde"
          ["admin3"]=>
          object(SimpleXMLElement)#12 (0) {
          }
          ["locality1"]=>
          string(8) "Bordeaux"
          ["locality2"]=>
          object(SimpleXMLElement)#13 (0) {
          }
          ["postal"]=>
          object(SimpleXMLElement)#14 (0) {
          }
          ["centroid"]=>
          object(SimpleXMLElement)#15 (2) {
            ["latitude"]=>
            string(8) "44.84948"
            ["longitude"]=>
            string(8) "-0.57653"
          }
          ["boundingBox"]=>
          object(SimpleXMLElement)#16 (2) {
            ["southWest"]=>
            object(SimpleXMLElement)#17 (2) {
              ["latitude"]=>
              string(9) "44.810928"
              ["longitude"]=>
              string(8) "-0.63874"
            }
            ["northEast"]=>
            object(SimpleXMLElement)#18 (2) {
              ["latitude"]=>
              string(9) "44.898319"
              ["longitude"]=>
              string(8) "-0.53333"
            }
          }
          ["areaRank"]=>
          string(1) "1"
          ["popRank"]=>
          string(1) "1"
          ["timezone"]=>
          string(12) "Europe/Paris"
        }
      }
    }
    Je souhaite récupérer la valeur de woeid donc je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $weather_xml = simplexml_load_string($weather_string);
    $woeid = $weather_xml->xpath('results/place/woeid');
    var_dump($woeid);
    Et la je récupère:
    Comment faire pour récupérer 580778 ?

    Merci de votre aide

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    C'est probablement dû à un problème de namespace. Pour pouvoir t'aider, il faudrait que tu fournisses la requête YQL qui t'a permis d'obtenir ce contenu xml, ou à défaut le xml complet (car dans ta chaîne il manque des morceaux, tu as sûrement dû faire un copier/coller de ce qui s'affichait dans ton navigateur, alors que pour l'obtenir tu dois faire un clique droit et affiche la source).

    Autre chose, as-tu envisagé de recevoir la réponse de l'api en json? C'est peut-être un peu moins lourdingue à manipuler non?

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2012
    Messages : 142
    Par défaut
    Bonjour CosmoKnacki,

    voici le lien:

    https://query.yahooapis.com/v1/publi...tableswithkeys

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Pour obtenir ce que tu veux, tu dois enregistrer le namespace avant ta requête XPath:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $weather_xml->registerXPathNamespace('d', 'http://where.yahooapis.com/v1/schema.rng');
    $woeid = $weather_xml->xpath('results/d:place/d:woeid');

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2012
    Messages : 142
    Par défaut
    Merci Cosmo ça fonctionne !

    Mais peux tu m'expliquer pourquoi je dois utiliser le namespace, il me semblait que je devais l'utiliser seulement si les balise le possédait (par exemple si la balise s'appelle d:place)

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    La balise "place" définit un namespace par défaut, si tu regardes le xml (comme je te l'ai dit, clique-droit/afficher la source), tu verras:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8"?>
    <query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="1" yahoo:created="2016-06-20T11:55:26Z" yahoo:lang="en-US">
        <results>
            <place xml:lang="en-US" xmlns="http://where.yahooapis.com/v1/schema.rng"...><woeid...
                                    ^-----ici
    Ce qui fait que tous les tags contenus dans "place" (lui-même inclus), auront ce namespace par défaut (ie: qui n'a pas de nom, c'est pourquoi il est écrit <place... et non <machintruc:place...). Ensuite tu peux l'appeler comme tu veux pour XPath, j'ai choisi "d" pour faire court, mais tu peux l'appeler "toto" ou "bidule".

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Pour ce qui est de l'approche JSON, c'est bien plus simple et plus léger, il suffit de changer paramètre format à json, ce qui donne: https://query.yahooapis.com/v1/public/yql?format=json&q=select%20*%20from%20geo.places(1)%20where%20text=%22%27bordeaux%27%22&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys, puis tu n'as plus qu'à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $jsO = json_decode($json);
     
    $woeid = $jsO->query->results->place->woeid;

Discussions similaires

  1. Utilisation de XPATH
    Par Loidemurphy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 02/07/2009, 13h30
  2. Utilisation d'Xpath avec GWT
    Par Koma dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 29/01/2009, 14h45
  3. [SimpleXML] utilisation de xpath
    Par merlin31 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 19/10/2007, 15h32
  4. [DOM] Utilisation d'Xpath
    Par Yoshio dans le forum Bibliothèques et frameworks
    Réponses: 17
    Dernier message: 23/08/2007, 14h33
  5. [XSL] impossible d'utiliser variable dans expression XPATH
    Par pierre.zelb dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/01/2006, 07h41

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