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] problème de requête Xpath


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Fabouney
    Invité(e)
    Par défaut [DOM] problème de requête Xpath
    bonjour à tous,

    j'ai u nfichier xml comme ceci :

    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
    <?xml version="1.0" encoding="ISO-8859-1" ?> 
    <mobibase>
      <song id_song="5089">
        <title>Let_It_Be</title> 
        <artist>The_Beatles</artist> 
        <date_added>2006-01-04</date_added> 
        <date_update>2006-01-09</date_update> 
          <file id_file="134">
             <nom>000134-The_Beatles-Let_It_Be.mp3</nom> 
             <track_type>Instrumental</track_type> 
             <crc32>435948014</crc32> 
             <size>5514057</size> 
           </file>
        </song
    </mobibase>

    si je fait cette requête Xpath, il me retourne aucuns résultat, et je ne vois pas pk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $xmlObject = new DomDocument();
    $xmlObject->load($fichierXML);
    $xmlPath = new DomXpath($xmlObject);
    $songXpath = "//mobibase/song[id_song=\"5089\"]";
    $result = $xmlPath->query($songXpath);
    echo $result->length."<br>";
    par contre si je recherche tt les song ("//mobibase/son")
    cela fonctionne.

    seriez-vous pourquoi ?
    Dernière modification par julp ; 29/04/2007 à 17h38.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    et comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $songXpath = "//mobibase/song[@id_song=\"5089\"]";
    ca fait un momment que je n'ai pas pratiqué mais je crois qu'il une histoire @
    http://www.w3.org/TR/xpath

  3. #3
    Fabouney
    Invité(e)
    Par défaut
    Ah bah vraiment merci jeff, comme quoi les doc c'est pas tjrs .... dans mon bouquin, ils mettent pas le @ ....
    enfin merci bien
    Dernière modification par Fabouney ; 29/09/2006 à 11h52.

  4. #4
    Fabouney
    Invité(e)
    Par défaut
    Another question ! lol
    désolé ...

    le résultat de mon Xpath me retourne le noeud <file>

    mon objectif c'est de modifier la valeur des noeuds <crc32>, <track_type>, <size>.
    pour infos, j'ai regarder dans la doc de DOM la méthode replaceChil() et je la trouve vraiment, mais alors vraiment pas clair.

    faut-il que je parcours les enfants de mon noeud?
    et que pour chaque enfants, je fait appel à la méthode replaceChild() pour modifier son contenu ?

    j'avais commencé à faire ceci, mais franchement je trouve pas de solutions, c'est plutot frustrant :

    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
    $xmlObject = new DomDocument();
    $xmlObject->load($fichierXML);
    $xmlPath = new DomXpath($xmlObject);
    $nodesList = $xmlPath->query("//mobibase/song[@id_song='$sid']/file[@id_file='$sfid']");
    $node = $nodesList->item(0);
    //parcours des enfants du noeuds trouvé
    foreach($node->childNodes as $c)
    {
    //selon le nom du noed, on initialise les variables
    if($c->nodeType == XML_ELEMENT_NODE)
    {
    	switch($c->nodeName)
    	{
    		case 'track_type' : ... ;
    	}
    }
    }
    $xmlObject->saveXML();
    :'(

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    tu a juste te placer sur le noeud en question et utilisé la methode nodeValue
    et c'est tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $c->nodeValue = $newCRC

  6. #6
    Fabouney
    Invité(e)
    Par défaut
    j'ai testé de faire ca .... et puis faire un saveXML aprés
    mais il change rien du tout :s

  7. #7
    Fabouney
    Invité(e)
    Par défaut
    AH c bon, en fait c'etait la méthode save() avec le fichier en paramétre ... lol
    ca m'apprendras à pas regarder ! depuis le début j'avais fait ca en plus pfff.
    merci pour le temp que tu m'a accordé jeff, bonne journée

  8. #8
    Fabouney
    Invité(e)
    Par défaut
    Décidement j'ai des problèmes de comrpéhension sur la classe DOM lol

    est-il possible de supprimer un noeud particulier dans le fichier XML, je m'explique.
    je récupére un noeud précis dans le fichierXML via Xpath, et je supprime ce noeud ainsi que ses enfants.

    bon c'est la méthode removeChild() sans aucun doute.

    j'ai procédé ainsi, mais il me dit que le noeud existe pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $nodeToDeleteList = $xmlPath->query("//mobibase/song[@id_song='$sid']");
    							$nodeToDelete = $nodeToDeleteList->item(0);
    try {
        $xmlObject->removeChild($node);
    }catch(DOMException $e){
         //Gestion de l'exception
         echo $e->getMessage()."<br>";
    }
    j'ai cette exception :

    Not Found Error
    P.S : je tient à préciser que $nodeToDelete est pas null, et que $noToDelete->nodeName = "song"
    merci d'avance.

  9. #9
    Fabouney
    Invité(e)
    Par défaut
    J'ai trouvé, pour ceux que ca interrese voila la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $nodeToDeleteList = $xmlPath->query("//mobibase/song[@id_song='$sid']");
    $nodeToDelete = $nodeToDeleteList->item(0);
    try {
        $xmlObject->documentElement->removeChild($nodeToDelete);
    }catch(DOMException $e){
         //Gestion de l'exception
         echo $e->getMessage()."<br>";
    }
    bonne nuit
    Dernière modification par Fabouney ; 29/09/2006 à 23h57.

Discussions similaires

  1. Problème de "requête" XPath
    Par Tuttu dans le forum C#
    Réponses: 5
    Dernier message: 19/09/2012, 10h35
  2. Réponses: 4
    Dernier message: 12/07/2011, 15h20
  3. [XPATH] [JDOM] Problème de requête XPath
    Par coco62 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 08/07/2008, 11h57
  4. [xPath et VBA-E]Problème de requête avec xPath
    Par EvaristeGaloisBis dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 17/06/2008, 09h11
  5. [DOM] Problème bizarre avec DOM et XPath
    Par fragmonster dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 16/03/2006, 14h43

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