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

Bibliothèques et frameworks PHP Discussion :

[DOM] Utilisation d'Xpath


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut [DOM] Utilisation d'Xpath
    Bonjour,

    Je cherche a récupérer la valeur d'un noeud :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0"?>
    <feed>
      <entry>
        <id>id</id>
        <title>ICI</title>
        <updated>date</updated>
      </entry>
      <entry>
        <id>id</id>
        <title>pas ici par contre</title>
        <updated>date</updated>
      </entry>
    </feed>
    J'ai compris qu'il fallait utiliser un truc comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	$xpath = new DomXPath($dom);
    	$path = $xpath->query('/feed/entry/title');
    Mais j'arrive pas a trouver quoi mettre dans le query pour que ça soit bon.

    Mon but étant de trouver un noeud qui a comme texte : ICI afin de modifier ce texte après.

    NB : J'ai lu ce topic mais ca m'avance pas plus : http://www.developpez.net/forums/sho...d.php?t=397194.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 188
    Points : 8 390
    Points
    8 390
    Billets dans le blog
    17
    Par défaut
    Tu veux récupérer le <title> du 1er <entry> ? Dans ce cas :

    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Je veux récupéré le title de l'entry qui a pour texte ICI.

  4. #4
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    C'est plutot un problème de XPath que de PHP dans ce cas...
    Syntaxe de XPath
    je dirai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /feed/entry/[title=='ICI']

  5. #5
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Marche pas. Avec 1 egale non plus.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    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
    <?php
    $xml = <<< EOX
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <feed>
      <entry>
        <id>id</id>
        <title>ICI</title>
        <updated>date</updated>
      </entry>
      <entry>
        <id>id</id>
        <title>pas ici par contre</title>
        <updated>date</updated>
      </entry>
    </feed>
    EOX;
     
    $dom = new DomDocument;
    $dom->preserveWhiteSpace = FALSE;
    $dom->formatOutput = TRUE;
    $dom->loadXML($xml);
    $xpath = new DomXPath($dom);
    $res = $xpath->query('//*[text() = "ICI"]');
    foreach ($res as $node) {
        printf('%s : %s<br/>', $node->nodeName, $node->nodeValue);
    }


    Pour le(s) modifier ensuite vous avez la réponse dans l'autre sujet.

  7. #7
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Ta solution marche mais elle va surement me prendre d'autre ligne qu'il ne faut pas d'après ce que j'ai compris.

    Je veux uniquement récupérer les ligne qui sont sous feed->entry->title.

    Pas des autre qui pourrait etre dans feed->autrechose.

  8. #8
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $res = $xpath->query('/feed/entry/title[text() = "ICI"]');

  9. #9
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Non ca j'ai essayé

    Ca me renvoie NULL donc c'est pas bon.

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    D'où la nécessité d'être précis

    Je me suis fait grillé par mon fillot car j'allais proposer la même chose. Vous n'auriez pas par le plus grand hasard des caractères spéciaux ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $res = $xpath->query(utf8_encode('/feed/entry/title[text() = "Mémé dans les orties"]'));
    Ce n'est pas forcément LA solution car cela dépend de l'encodage que vous pouvez utiliser/spécifier.

  11. #11
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 64
    Points : 71
    Points
    71
    Par défaut
    Euh dites moi... pourquoi est-ce que vous mettez "/feed/"

    ( la réponse de koopajah etait : "$res = $xpath->query('/feed/entry/title[text() = "ICI"]');" donc presque correcte )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $nodes = $str -> xPath('//entry/title[text()="ICI"]');
     
    var_dump( $nodes );

  12. #12
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Citation Envoyé par _cqu_ Voir le message
    Euh dites moi... pourquoi est-ce que vous mettez "/feed/"

    ( la réponse de koopajah etait : "$res = $xpath->query('/feed/entry/title[text() = "ICI"]');" donc presque correcte )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $nodes = $str -> xPath('//entry/title[text()="ICI"]');
     
    var_dump( $nodes );
    Je mets feed parce que je dis / <= en partant de la racine
    feed <= dans les noeuds feed
    /entry <= dans les noeuds entry fils du noeud feed
    /title <= dans le noeud title
    [text() = "ICI"] <= dont la valeur est "ici"

    dans ta formulation, si on a des noeuds entry qui sont fils d'un noeud title par exemple ca les prendra en compte quand meme.

  13. #13
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 64
    Points : 71
    Points
    71
    Par défaut
    Ah oui c'est vrai

  14. #14
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Je n'ai aucun caractère accentuer, juste un espace dans la chaine.

    La solution de cqu donne NULL aussi.

    Voila le XML que j'utilise pour les test :
    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
    19
    <?xml version="1.0"?>
    <feed xmlns="http://www.w3.org/2005/Atom">
      <id>http://localhost/zf/public/</id>
      <title>News</title>
      <link href="http://example.org/"/>
      <updated>2003-12-13T18:30:02Z</updated>
      <author>
        <name>Yoshio</name>
        <email>mail@example.com</email>
      </author>
      <link rel="self" href="http://localhost/zf/public/feed"/>
      <category term="anime"/>
      <rights>&#xA9; 2007 Yoshio</rights>
      <entry>
        <id>luciela-feed:id:1041086e6f26beb0daa6eacd14a8595c</id>
        <title>Test RSS</title>
        <updated>2007-08-22T19:59:40+02:00</updated>
      </entry>
    </feed>

    et le code :
    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
    <?php
     
    // Load Xml
    $dom = new DOMDocument();
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->load('public/feed/news.xml');
     
    $oldNewsTitle = 'Test RSS';
     
    $xpath = new DomXPath($dom);
    $res = $xpath->query('/feed/entry/title[text()="'.$oldNewsTitle.'"]');
     
    var_dump($res->item(0)->nodeValue);
     
    foreach ($res as $node) {
        printf('%s : %s<br/>', $node->nodeName, $node->nodeValue);
    }
     
     
    // Save XML to file
    $dom->save('public/feed/news.xml');	
     
     
    ?>

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    C'est à cause du namespace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # ...
    $xpath = new DomXPath($dom);
    $xpath->registerNamespace('ns', $dom->documentElement->namespaceURI);
    $res = $xpath->query('/ns:feed/ns:entry/ns:title[text() = "'.$oldNewsTitle.'"]');
    # ...

  16. #16
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Ah gg ca

    Est ce que je pourrais avoir un petit supplément d'information ?
    C'est quoi ce namespace ? ns ? Pourquoi le fait de le rajouter ca marche ?

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par Yoshio
    C'est quoi ce namespace ?
    C'est toi qui en donne un par défaut pour Atom dans ton document ici :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns="http://www.w3.org/2005/Atom"

    Citation Envoyé par Yoshio
    ns ?
    C'est simplement un nom que j'ai choisi pour renommer le namespace par défaut qui n'est pas reconnu.

    Citation Envoyé par Yoshio
    Pourquoi le fait de le rajouter ca marche ?
    XPath (libxml2, la librairie sous-jacente ?) ne sait pas s'en sortir seule avec un espace de nom par défaut. On aurait pu écrire autrement l'expression XPath sans modifier le document XML pour s'en sortir, du style :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    /*[local-name() = "feed"]/*[local-name() = "entry"]/*[local-name() = "title" and text() = "Test RSS"]

  18. #18
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Ok merci des précisions.

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

Discussions similaires

  1. [DOM] utiliser une fonction
    Par leaemile dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 28/08/2007, 12h38
  2. [ASP] DOM selectSingleNode et Xpath
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/08/2007, 17h02
  3. [DOM] Utilisation de removeChild
    Par sylsau dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/01/2006, 10h31
  4. [DOM] Utilisation de l'API DOM pour créer du HTML sous IE
    Par pedouille dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/01/2006, 14h48

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