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] Résultat Xpath sous forme de tableau


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Par défaut [DOM] Résultat Xpath sous forme de tableau
    Bonjour, dur dur dur de se mettre à niveau!

    J'ai un document Xml que j'interroge avec php et la "méthode" xpath.
    Mon doc XML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <REC>
    <FLD NAME="Nom du jeu">Elixir</FLD>
    <FLD NAME="Ref">0871</FLD>
    <FLD NAME="Editeur">Asmodée</FLD>
    <FLD NAME="Rubrique 6">Ton jeu est en cours de livraison, réception dans 2 jours!</FLD>
    		</REC>
    Je récupère toutes les valeurs de la balise ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    	$dom = new DOMDocument();
    	$dom->load('xml/expor.xml');
    	$xpath = new DOMXPath($dom);
            $result = $xpath->query('//FLD[@NAME="Ref"]') ;
     
            foreach ( $result as $child ) {
    	    echo $child->tagName, ' = ',  $child->nodeValue, '<br>' ;
            }
     
    ?>
    Je bloque pour mettre un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($result='0871'){...}
    $result est un objet, normal que ça ne marche pas!
    Il faut donc transcrire le résultat de la requête xpath sous la forme d'un tableau.
    Mais voilà, je n'y arrive pas! La consultation des sujets du forum et de la FAQ ne m'en apprend pas plus donc je m'en remets à vous, encore une fois lol!

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Par défaut
    ThomasR aborde le concept dans une réponse à ce sujet: http://www.developpez.net/forums/d10...tion-attribut/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $caracteristiques = array(); // info => valeur
    $caracteristiques_entries = $xpath->query('//table[@class="description" and position() = 1]/tr');
     
    foreach($caracteristiques_entries as $entry){
        $caracteristiques[$entry->childNodes->item(1)->nodeValue] = $entry->childNodes->item(3)->nodeValue;
    }
    mais je ne parviens pas à le réutiliser...

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    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
    <?php
    	$test="0871";
    	$dom = new DOMDocument();
    	$dom->load('xml/expor.xml');
    	$xpath = new DOMXPath($dom);
     
     
    $result = $xpath->query('//FLD[@NAME="Ref"]') ;
    $caracteristiques = array();
    $i=1;
    foreach ( $result as $child ) { //Pour chaque valeur de Référence,
     
    $caracteristiques[$i] = $child->nodeValue; //caracteristiques[i] prend la ième valeur de Référence
    if ($caracteristiques[$i]==$test){	//Si caracteristique[i]= variable $test :
    echo $caracteristiques[$i];  //on affiche la Référence et
    exit(); //fin du traitement
    }
    $i=$i+1;//sinon incrémentation et la boucle continue
    }
     
    echo "Référence invalide"; //Pas de Référence correspondant à la valeur de la variable $test
     
    ?>
    Ce code fonctionne mais ne ramène que le nom de la référence que je cherche. J'ai besoin des autres balises Name.
    Le Xpath doit aller un cran plus haut (facile) mais j'ai toujours un problème dans la restitution du résultat: comment construire un tableau multidimensionnel à 4 colonnes qui récupère les nodevalues?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Par défaut
    Sans réponse de votre part, et bien, disons le, je me pose des questions.
    Je reste bloqué sur la récupération des nodevalues dans un tableau multi dimensionnel...

    La méthode que j'emploie est-elle mauvaise? Je ferai mieux de passer par un import xml vers une base mysql puis de faire tranquillement l'extraction avec php?

    Merci.

  5. #5
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Hello

    S'il s'agit de récupérer des nodes pour les transformer et les afficher en HTML, il vaut mieux passer par une transformation XSLT, c'est plus rapide et plus souple:
    http://php.net/manual/en/class.xsltprocessor.php

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Par défaut
    Ok ça semble être l'outil approprié. Y a plus qu'à!

    Merci beaucoup!

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Par défaut
    Si je comprends bien, avec beaucoup de chance
    le fichier xsl est le schéma du fichier xml.

    On interroge (car xsl est aussi un langage) avec la fonction value of select= xpath

    What else?

    Non, un peu plus sérieusement... c'est plutôt balèse pour un non-informatico-addicte ça non?

  8. #8
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    C'est vrai que c'est pas super simple à comprendre au départ.
    Pour commencer, XSLT n'est pas un langage, c'est du XML, il n'y a donc pas de notion de fonction à proprement parler. Ce n'est pas non plus le schéma de ton XML, ça c'est la DTD (Document Type Defintion) dont l'objet est de décrire comment un document XML doit être formé dans un cas bien spécifique (XHTML par exemple dispose d'une DTD disponible sur le site du W3C).

    XSLT nous sert donc à transformer notre XML dans un autre XML, dans ton cas, transformer un flux XML en XHTML.

    Je pense qu'un bon point de départ pour te faire les dents sur cette techno est le tuto de w3school: http://www.w3schools.com/xsl/
    Si tu as des soucis pour comprendre, le forum est là pour ça

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    Citation Envoyé par granchef Voir le message
    Je bloque pour mettre un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($result='0871'){...}
    $result est un objet, normal que ça ne marche pas!
    Il faut donc transcrire le résultat de la requête xpath sous la forme d'un tableau.
    Mais voilà, je n'y arrive pas! La consultation des sujets du forum et de la FAQ ne m'en apprend pas plus donc je m'en remets à vous, encore une fois lol!
    Voilà comment je ferai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
    	$dom = new DOMDocument();
    	$dom->load('xml/expor.xml');
    	$xpath = new DOMXPath($dom);
            $result = $xpath->query('//FLD[@NAME="Ref"]') ;
     
            foreach ( $result as $child ) {
                if($child->nodeValue == '0871'){
                    // autre chose ?
                }else
    	    echo $child->tagName, ' = ',  $child->nodeValue, '<br>' ;
            }
    ?>
    Si tu es plus à l'aise avec les arrays, tu peux créer un array grâce à ton foreach() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    	$dom = new DOMDocument();
    	$dom->load('xml/expor.xml');
    	$xpath = new DOMXPath($dom);
            $result = $xpath->query('//FLD[@NAME="Ref"]') ;
            $arrayDuXML = array();
            foreach ( $result as $child ) {
                if($child->nodeValue == '0871'){
                    // autre chose ?
                }else
    	    $arrayDuXML[$child->nodeName] = $child->nodeValue;
            }
            var_dump($arrayDuXML);
    ?>

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/10/2012, 17h07
  2. Résultat d'une fonction sous forme de tableau
    Par Touty01 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 31/05/2010, 23h35
  3. [MySQL] Afficher des résultat sous form de tableau invisible ?
    Par tentsuken dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/01/2008, 15h18
  4. Réponses: 4
    Dernier message: 09/05/2007, 23h39
  5. [FPDF] Exporter résultat en PDF mais sous forme de tableau
    Par Luverger dans le forum Bibliothèques et frameworks
    Réponses: 13
    Dernier message: 09/03/2007, 12h13

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