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 :

Extration d'info d'un fichier XML


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 115
    Points : 60
    Points
    60
    Par défaut Extration d'info d'un fichier XML
    Bonjour

    Je débute en PHP pour faire une extraction d'un fichier XML.
    Je me suis inspiré du tutorial de Stephane Ligoza http://jerome.developpez.com/xmlxsl/xpath/
    Je bute sur un problème de selection des éléments d'après leur contenu (ils n'ont pas d'attribut)

    J'y arrive avec le code PHP suivant mais
    - sur un nombre de données important je trouve pas que cela soit optimisé
    - si mes données ne sont pas ordonnées je n'obtiens pas les bonnes valeurs et le rajout d'un test if va m'alourdir encore 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
    $query = "//*[starts-with(name(),'CODE')]"; 
    $selected = $xpath->query($query); 
    $K=0; 
    foreach ($selected as $code) { 
      $ident='XA'; 
      $posstr=strpos($code->nodeValue,$ident); 
    if (!($posstr === false)){ 
      if ($posstr==0) { 
        $Ident[$K] = $code->nodeValue; 
        $Prix[$K] = $code->nextSibling->nextSibling->nodeValue; 
        $K++; 
      } 
    } 
    }
    Voici ma structure
    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
    <AAA> 
    <XXX> 
    <DDD> 
    <CODE>XAFT</CODE> 
    <NAME>MON NOM</NAME> 
    <PRIX>100</PRIX> 
    </DDD> 
     
    <DDD> 
    <CODE>XAGT</CODE> 
    <NAME>PLUS CHER</NAME> 
    <PRIX>120</PRIX> 
    </DDD> 
     
    <DDD> 
    <CODE>XAUT</CODE> 
    <PRIX>80</PRIX> 
    <NAME>MOINS CHER</NAME> 
    </DDD> 
     
    <DDD> 
    <CODE>YBUT</CODE> 
    <PRIX>200</PRIX> 
    <NAME>DESORDONNE</NAME> 
    </DDD> 
     
    <DDD> 
    <CODE>YAFT</CODE> 
    <PRIX>220</PRIX> 
    <NAME>ORDONNE</NAME> 
    </DDD> 
    </XXX> 
    </AAA>
    Je pense que je n'utilise pas la bonne expression pour mon extraction

    Quelle expression XPATH me permettrait d'extraire les éléments CODE qui débute par 'XA' et récupérer les informations des éléments frères associé (prix)

    Merci de votre aide

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 266
    Points : 8 564
    Points
    8 564
    Billets dans le blog
    17
    Par défaut Re: Extration d'info d'un fichier XML
    Citation Envoyé par FlyByck
    Quelle expression XPATH me permettrait d'extraire les éléments CODE qui débute par 'XA' et récupérer les informations des éléments frères associé (prix)
    Autant récupérer les <DDD> dont les deux premiers caractères de <CODE> valent "XA" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = '//DDD[starts-with(CODE, "XA")]' ;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Merci pour la bonne formulation, je n'avais pas bien compris l'exemple 8 et mon expression etais incorrecte

    Et si je veux le prix associé a l'élément selectionné, il doit être possible de trouver l'element frère autrement qu'avec next et previous

    Joël

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 266
    Points : 8 564
    Points
    8 564
    Billets dans le blog
    17
    Par défaut
    Oui, en accédant simplement à l'élément qui t'intéresse depuis un noeud <DDD> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
        header('Content-Type: text/plain') ;
     
        $xml = simplexml_load_file('ton_fichier.xml') ;
        $nodes = $xml->xpath('//DDD[starts-with(CODE, "XA")]') ;
        foreach ( $nodes as $node ) {
            echo $node->CODE, ' : ', $node->PRIX, " €\r\n" ;
        }
    ?>

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 20
    Points
    20
    Par défaut
    A coup de preg_match et preg_match_all, on y arrive aussi

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Merci pour le bout de code c'est exactement ce qui me manquait

  7. #7
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    un petit complement d'info sur xpath :
    http://jerome.developpez.com/xmlxsl/xpath/

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    C'est le même lien que celui cité dans le post de départ
    L'exemple avec l'utilisation de name ne m'a pas paru clair
    Ce cas résolu me semble plus parlant

    Merci

  9. #9
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    autant pour moi ça m'apprendra a lire en diagonale

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Je relance le sujet car le fonctionnement en local etait parfait sauf que sur le serveur je ne dispose pas de la fonction simplexml cette librairie n'est pas compilé. Il y a DOM
    Voici ce le code que j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $list = new DOMDocument();
    $list->load('mon_fichier.xml');
    $listXPath = new DOMXPath($list);
    $nodes = $listXPath->query('//DDD[starts-with(CODE, "XA")]');
    foreach ($nodes as $node) {
            echo $node->CODE, ' : ', $node->PRIX, " €\r\n" ;
    }
    mais cette syntaxe ne fonctionne pas
    J'ai bien acces à la valeur du CODE avec $node->nodeValue mais pas à son frère PRIX

    Merci

  11. #11
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    t'as une erreur ?

    fais un var_dump de $node pour voir ce qu'il y a dedans

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    un var_dump me retourne
    object(DOMElement)#12 (0) { }

    ?

  13. #13
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    deja la c'est pas logique il devrait au moins te montrer code

    et un sur $nodes ?

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    En fait je n'ai pas non plus Code
    En fait comme je veux tout, ma requete pour cette action est
    $nodes = $listXPath->query('//DDD');
    count($node) = 22 est bon mais je n'accede pas au contenu
    un var_dump ($nodes) me retourne
    object(DOMNodeList)#58 (0) { }

    :

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Avec
    echo $node->nodeValue
    j'affiche le contenu CODE+NAME+PRIX mais je n'ai pas acces à chaque donnée séparément
    Comment séparer ces valeurs dans des variables distinct ?

  16. #16
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $childnodes = $nodes->child_nodes();
     
      foreach ($childnodes as $child) {
         echo $child->tagname . " : " . $child->get_content() . "<br />";
      }

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Cela ne marche pas, voici le code complet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $query = "//DDD[starts-with(CODE, 'XA')]";
    $dom = new DOMDocument();
    $dom->load('testxml.xml');
    $listXPath = new DOMXPath($dom);
    $nodes = $listXPath->query($query);
    foreach ($nodes as $child) {
        $childnodes = $nodes->child_nodes; //Ceci retourne un type NULL
        echo $childnodes->nodeValue;         // Ceci est vide
        echo $child->tagName." : ";             // Cela affiche DDD
        echo $child->get_content;               // Ceci est vide
        echo $child->nodeValue.'<br/>' ;    // Cela affiche CODE+NAME+PRIX     
    }
    J'ai essayé getElementsByTagName("CODE") sans plus de succès

    Les element fils ne sont toujours pas accessibles indépendaments
    Voila pourquoi simplXml porte ce nom ?[/code]

  18. #18
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $query = "//DDD[starts-with(CODE, 'XA')]";
    $dom = new DOMDocument();
    $dom->load('testxml.xml');
    $listXPath = new DOMXPath($dom);
    $nodes = $listXPath->query($query); 
    $childnodes = $nodes->child_nodes();
     
      foreach ($childnodes as $child) {
         echo $child->tagname . " : " . $child->get_content() . "<br />";
      }
    on y voit plus clair avec des balises code

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Mon correcteur de syntaxe n'accepte pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $childnodes = $nodes->child_nodes();
    foreach ($childnodes as $child) {
        echo $child->tagname." : ".$child->get_content()."<br/>";
    }
    La syntaxe proposée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $childnodes = $nodes->child_nodes;
    [foreach ($childnodes as $child) {
        echo $child->tagName." : ".$child->get_content."<br/>";
    }
    Mais ce code ne fonctionne pas

    var_dump($childnodes) me retourne NULL
    Bien sur la ligne echo n'est pas effectué donc je ne peux pas vérifier si on accéde aux valeurs de chaque enfant

    Merci pour l'aide et pour l'utilisation de la balise code

  20. #20
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    désolé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $list = new DOMDocument();
    $list->load('mon_fichier.xml');
    $listXPath = new DOMXPath($list);
    $nodes = $listXPath->query('//DDD[starts-with(CODE, "XA")]');
    foreach ($nodes as $node) {
           foreach($node->childNodes as $item){
                echo $item->nodeValue;
           }
    }
    :

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Extraire des infos d'un fichier XML de manière automatique
    Par dinozo13 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 16/09/2008, 10h28
  2. afficher info d'un fichier xml
    Par ruvele dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 29/05/2008, 11h36
  3. Recuperer des infos d'un fichier XML
    Par Seth77 dans le forum C#
    Réponses: 1
    Dernier message: 01/02/2007, 11h00
  4. récuperer des infos dasn fichier xml
    Par alliance dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 14/02/2006, 17h57
  5. Récupérer des infos d'un fichier xml ?
    Par OtObOx dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 06/02/2006, 18h53

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