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 :

DOM récupération valeur d'un xml


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut DOM récupération valeur d'un xml
    Bonjour,

    Je voudrai arriver à récupérer des valeurs dans un XML. Pour récupérer le niveau 0, pas de souci. Le problème vient surtout des autres niveaux.

    exemlpe de xml:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <niveau0>
      <elementsimple1>Coucou</elementsimple1>
      <elementniveau1>
           <elementniveau2>
                 <nom>zerros</nom>
                 <prenom>C'est moi</prenom>
           </elementniveau2>
           <elementniveau2>
                 <nom>cat</nom>
                 <prenom>C'est toi</prenom>
           </elementniveau2>
      </elementniveau1>
    </niveau0>

    Si je veux récupérer le contenu de <elementniveau1> je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $items = $this->xml->getElementsByTagName("elementniveau1");
    foreach ($items as $item) {
      echo $item->nodeValue;
    }
    Mais je me retrouve avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zerrosC'est moi catC'est toi
    Et le tout en une seule ligne (un seul string). Je voudrai pouvoir mettre les éléments dans un array ou alors formater le texte pour avoir chaque élément l'un en dessous de l'autre.

    Existe t il une super fonction permettant de le faire ?

    J'espère que vous pourrez me filer un coup de main

  2. #2
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    C'est normal que tu as tout sur une même ligne puisque avec la commande
    echo $item->nodeValue; tu généres un affichage des items un par un sans séparateur. Pour sauter une ligne tu peux utiliser le code html correspondant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo $item->nodeValue.'<br />';
    Et puis l'array tu l'as déjà, c $items

  3. #3
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    Alors ça ne fonctionne pas chez moi ...

    J'ai fait 2 tests. Si je veux récupérer des éléments directs, effectivement, avec le <br /> ou mettre les value dans un array fonctionne.

    exemple si je récupère <nom> directement, il récupère TOUS les <nom> et je peux les mettre dans un array.

    par contre si je récupère <elementniveau1>, il me mets tout à la suite, et je ne peux rien y faire. Existe t il une fonction capable de récupérer toutes les valeurs d'un niveau dans un array ?

  4. #4
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Oui désolé, c moi qui raconte n'importe quoi !!!

    Je pense que dans ta boucle tu dois quand même avoir deux éléments:
    'zerrosC'est moi' et 'catC'est toi' puisque tu as un espace entre les deux.

    Ensuite tu devrais regarder la structure de $items champ par champ avec un var_dump.

    En gros, il va falloir avancer dans ton fichier XML, en testant si il existe des tags <elementniveau1> et <elementniveau2>

  5. #5
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Tu peux essayer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $listeElmt1 = $this->xml->getElementsByTagName("elementniveau1");
    foreach ($listeElmt1 as $elmt1) {
      $listeElmt2 = $elmt1->getElementsByTagName("elementniveau2");
      foreach ($listeElmt2 as $elmt2) {
         echo $elmt2->nodeValue'<br />';
      }
    }
    Pour nom et prénom, il faudra descendre d'un cran supplémentaire et puis tu as des tests à ajouter pour prendre les tags <elementniveau1> <elementniveau2> <nom> <prenom>

    Tu peux utiliser firstChild et nextChild pour le nom et prenom de chaque noeud d'élémentniveau2 aussi ...

  6. #6
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    ok. alors si je comprends bien, il vaut mieux travailler avec hasChildNodes pour récupérer tous mes éléments dans un array.

    Bon, étant donné que je découvre DOM, ça va ma prendre un peu de temps ...

  7. #7
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Oui en effet, pour les tests tu utilises hasChildNode(), et tu vas être obligé de jouer avec les boucles comme vues ci dessus et ces tests. Plus ta structure sera compliquée plus tu vas avoir du code à faire

    Regardes aussi sur ce site Dom et Php comme par exemple ici

  8. #8
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    Bon je galère un peu.

    J'ai codé 2 fonctions. La première parcours le xml à partir d'un getElementsByTagName, et renvoi à haschild qui vérifie si l'élément possède un enfant. je me suis aidé des fonctions qui sont sur la page de manuel de php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self::showNode($this->xml->getElementsByTagName("elementniveau1")->item(0));
    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
    public function showNode($tree) {
                            $res = array();
                            foreach ($tree->childNodes as $node) {
                                    if (self::hasChild($node)) {
                                            self::showNode($node);
                                    } else {
                                            //echo $node->nodeName.' -> '.$node->nodeValue.'<br>';
                                            $res[] = "$node->nodeName -> $node->nodeValue";
                                    }
                            }
                            echo "<pre>";
                            print_r($res);
                            echo "</pre>";
                            return $res;
                    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public function hasChild($nodes) {
                            if ($nodes->hasChildNodes()) {
                                    foreach ($nodes->childNodes as $node) {
                                            if ($node->nodeType == XML_ELEMENT_NODE)
                                                    return true;
                                    }
                            }
                            return false;
                    }
    Le problème est qu'il ne me renvoi rien car au lieu de créer un seul array avec tous les enregistrements dedans, il me crée autant d'array qu'il y a d'enfants à partir du "elementniveau1". Comment puis-je faire pour tout mettre dans le même array ?

  9. #9
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    J'ai trouvé. J'ai finalement passé mon array $res en paramètre du showNode et j'évite de le re-écraser avec un self::showNode($node,&$res).

    J'arrive maintenant à récupérer ce dont j'ai besoin dans un array.

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

Discussions similaires

  1. [DOM] Récupération de donnée en fonction de la valeur d'un attribut
    Par Space Cowboy dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 25/11/2010, 12h59
  2. [DOM] récupération d'une valeur décimale dans un flux XML
    Par Batisbat dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 18/02/2008, 13h48
  3. [DOM] récupération d'une balise par la valeur de son attribut
    Par slyfer dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 10/11/2007, 14h50
  4. Réponses: 1
    Dernier message: 02/04/2007, 13h37
  5. [DOM] récupération de XML par PHP
    Par shingara dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 13/02/2006, 21h56

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