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 :

Récupérer valeur d'un noeud xml vers du php


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 62
    Points : 39
    Points
    39
    Par défaut Récupérer valeur d'un noeud xml vers du php
    Bonsoir à tous,

    Je viens vers vous car je n'arrive pas à récupérer des valeurs de plusieurs nœuds.

    Je vous explique le projet

    A partir d'un lecteur carte vitale je dois récupérer les valeurs Nom,Prénom,Date de naissance et numéro de sécurité sociale pour qu'il soit inscrit automatiquement sur un formulaire ( Je pense utilisé les fonctions $post)

    Voici un bout du fichier xml que cardpeek me fournit

    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
                <node>
                  <attr name="classname">item</attr>
                  <attr name="label">Nom</attr>
                  <attr name="id">80</attr>
                  <attr name="size">63</attr>
                  <attr name="val" encoding="bytes">8:4C555A202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020</attr>
                  <attr name="alt">NOM DU CLIENT                                                            </attr>
                </node>
                <node>
                  <attr name="classname">item</attr>
                  <attr name="label">Prénom</attr>
                  <attr name="id">81</attr>
                  <attr name="size">45</attr>
                  <attr name="val" encoding="bytes">8:42454E4A414D494E2020220202020202020202020202020202020202020202020202020202020202020</attr>
                  <attr name="alt">PRENOM DU CLIENT                                     </attr>
                </node>
                <node>
                  <attr name="classname">item</attr>
                  <attr name="label">Date de naissance</attr>
                  <attr name="id">82</attr>
                  <attr name="size">8</attr>
                  <attr name="val" encoding="bytes">8:3139383353232</attr>
                  <attr name="alt">XX/XX/XXXX</attr>
                </node>
    J'ai lus énormément de tutoriel pour utiliser DOM ou SimpleXML mais cela ne fonctionne pas car ou je coince c'est pour prendre les valeurs en vert

    J'ai essayé de récupérer mes valeurs à partir de ce code mais celui ne m'affiche rien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
      $dom = new DomDocument;
      $dom->load("test.xml");
      $nom = $dom->getElementsByTagName('attr');
      foreach($valeur_nom as $nom)
        echo $nom->firstChild->nodeValue . "<br />";
    ?>
    En espérant avoir une aide,

    En vous remerciant par avance,

    Funky

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    En parcourant la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $nodes = $dom->getElementsByTagName('nodes');
    foreach ($nodes as $nodes) {
    	foreach ($nodes->getElementsByTagName('attr') as $node_attr) {
    		$attr = $node_attr->getAttribute('name');
    		if ($attr == "alt") {
    			echo $node_attr->nodeValue;
    		}
    	}
    }
    ou en utilisant un xpath :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $xpath = new DOMXpath($dom);
    $elements = $xpath->query("/nodes/node/attr[@name='alt']");
    foreach ($elements as $value) {
    	echo $value->nodeValue;
    }
    dans les 2 cas j'ai supposé que tu as avais un niveau "nodes" au dessus de "node".
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    Merci Sabotage de ta réponse.

    En essayant ton code j'ai eu des erreurs lors de visualisation avec mon fichier php

    Ici je remet la structure réduit de mon .xml ( Ce que me donne cardpeek avec toutes les informations comporte 3170 lignes )

    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
    <?xml version="1.0" type="UTF-8"?>
    <cardpeek>
      <version>0.8.4-win32</version>
      <node>
        <attr name="classname">card</attr>
        <attr name="alt">VITALE 2</attr>
        <node>
          <attr name="classname">atr</attr>
          <attr name="label">cold ATR</attr>
          <attr name="size">10</attr>
          <attr name="val" encoding="bytes">8:3B751300004309EA9000</attr>
          <node>
            <attr name="classname">item</attr>
            <attr name="label">Possibly identified card</attr>
            <attr name="val">Vitale 2 (french health card)</attr>
          </node>
        </node>
     </node>
    <cardpeek>
    Comme tu l'avais signalé il y a bien un node au dessus

    J'ai inséré le code que tu m'a transmis comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $dom = new DomDocument;
    $dom->load("xml.xml");
    $nodes = $dom->getElementsByTagName('node');
    foreach ($nodes as $node) {
    	foreach ($nodes->getElementsByTagName('attr') as $node_attr) {
    		$attr = $node_attr->getAttribute('name');
    		if ($attr == "alt") {
    			echo $node_attr->nodeValue;
    		}
    	}
    }
    ?>
    J'ai également supprimés les "s" de node car dans le fichier .xml ils n'en disposent pas

    Mais aucune valeurs ne ressort...

    J'avais également vu xpath

    J'ai aussi essayé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     <?php
    $xml=simplexml_load_file("xml.xml") or die("Error: Cannot create object");
    echo $xml->node[0]->attr . "<br>";
    ?>
    Mais de même pas de valeurs..

    Depuis hier j'ai la tête dans le guidon et je pense que je vois pas mes erreurs..

    Merci d'avance pour les réponses

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    ton premier niveau c'est "cardpeek" pas "node"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $elements = $xpath->query("/cardpeek/node/attr[@name='alt']");
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $nodes = $dom->getElementsByTagName('cardpeek');
    foreach ($nodes as $nodes) {
    	foreach ($nodes->getElementsByTagName('attr') as $node_attr) {
    		$attr = $node_attr->getAttribute('name');
    		if ($attr == "alt") {
    			echo $node_attr->nodeValue;
    		}
    	}
    }
    Mais est-ce que c'est vraiment la bonne structure que tu nous as montré là ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    Voici mon fichier .xml au complet
    card2.xml

    Avec ton code je retourne une erreur

    Warning: DOMDocument::load(): parsing XML declaration: '?&gt;' expected in file:/C:/wamp64/www/card.xml, line: 1 in C:\wamp64\www\test.php on line 3
    Mon code avec le tiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $dom = new DomDocument;
    $dom->load("card2.xml");
    $nodes = $dom->getElementsByTagName('cardpeek');
    foreach ($nodes as $nodes) {
    	foreach ($nodes->getElementsByTagName('attr') as $node_attr) {
    		$attr = $node_attr->getAttribute('name');
    		if ($attr == "alt") {
    			echo $node_attr->nodeValue;
    		}
    	}
    }
    ?>

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Chez moi, ça fonctionne à la seule restriction que ce type="UTF-8"n'est pas correct.
    Ca devrait être encoding="UTF-8"
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    Tu utilises quoi pour voir les valeurs ?

    J'ai installé WAMP sur mon pc pour tester ma page .php et j'ai jamais rien qui s'affiche mis à part l'erreur que je cité plus haut..

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    La c'était un vieux Xampp mais je ne crois pas que ça change grand chose.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    J'ai essayé WAMP sur mon raspberry avec les codes ci-dessus et mon fichier card2.xml

    Les 2 fichiers sont dans /var/www/html

    Je tape l'adresse IP du RPI suivi de mon fichier.php et page blanche..

    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dom->load("card2.xml");
    J'ai mis localhost/card2.xml
    Mon ip mais rien

    Je fais mal quelque chose ?

  10. #10
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    J'ai essayé WAMP sur mon raspberry avec les codes ci-dessus et mon fichier card2.xml
    Oui, si on n'a pas corrigé le prolog comme déjà dit (type="UTF-8" doit être lit encoding="UTF-8"), tout essai en variant l'ip du serveur du fichier, script sur le système de fichiers locaux etc n'a pas trop de sens. Le prolog a lui-même une construction syntaxique stricte et il est d'une partie intégrante du bien-formatage du document xml. Et un document mal formé casse tout. Soit enlever le prolog, soit corriger le comme dit avant toute chose, on tiendrait bon.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    D'accord mais le soucis est que mon xml c'est le logiciel cardpeek qui me le fournit

    Est-il possible en une commande de modifier la ligne du prolog ?

    De plus si je lis mon fichier card2.xml sans avoir à changer le prolog celui ci est mal compris = Logique

    Si je met le bon prolog il est lu par le navigateur = Logique

    Mais si je passe par mon test.php en changeant le prolog, toujours page blanche.. Je ne trouve pas mes valeurs avec l'attribut "alt" ?

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu peux nous montrer ton XML corrigé à la main et ton code PHP exact ?
    Parce que chez moi ce que je t'ai fourni ça fonctionne.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    Alors voici le fichier .xml card utf8.xml

    Apres je ne sais pas si il fallait tout simplement changer la 1ere ligne (?)

    Et mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $dom = new DomDocument;
    $dom->load("card2.xml"); 
    $nodes = $dom->getElementsByTagName('cardpeek');
    foreach ($nodes as $nodes) {
    	foreach ($nodes->getElementsByTagName('attr') as $node_attr) {
    		$attr = $node_attr->getAttribute('name');
    		if ($attr == "alt") {
    			echo $node_attr->nodeValue;
    		}
    	}
    }
    ?>
    card2.xml c'est bien l'xml que je met en P.J

    EDIT: J'affiche mes valeurs en modifiant comme vous l'avez dit l'encoding par contre est il possible de sélectionner que des éléments qui m'interesse ? Et également changer l'encoding ?

    Car j'ai bien les valeurs de ALT mais toutes et il je n'ai besoin que du Nom,Prénom,Date de naissance et numéro de sécu

    EDIT 2: J'ai trouvé quelque chose pour pouvoir changer mon prolog mais si j'appel mon .php j'ai des erreurs

    Voici le code trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $carte = 'card2.xml';
    $dom = new DOMDocument();
    $dom->load($carte);
    $raw_without_prolog = $xml->saveXML($xml->documentElement);
     
    $prolog = '<?xml version="1.0" encoding="UTF-8"?>';
     
    $new_xml = new DOMDocument();
    $new_xml->load($prolog . $raw_without_prolog);
     
    echo $new_xml->saveXML();

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    Ok j'ai trouvé la commande pour modifier mon type de prolog voici le code pour quelqu'un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    $remote_file = "card2.xml";
    $new_file    = "Fichier_ok.xml";
     
    $baltic_xml  = file_get_contents($remote_file);
    $unicode_xml = iconv("UTF-8", "UTF-8", $baltic_xml);
    $unicode_xml = str_replace('type="UTF-8"', 'encoding="UTF-8"', $unicode_xml);
     
    $xml         = new SimpleXMLElement($unicode_xml);
    // do stuff with $xml
    $xml->asXml($new_file);
    Maintenant comment récupérer juste les valeurs Nom, Prénom,Date de naissance et Numéro de sécu ? On peut le faire avec un numéro de ligne ? Ou à partir de l'ID et de demander la valeur de alt ?

    Je sais que pour:
    Nom: La valeur est à la ligne 915
    Prénom: La valeur est à la ligne 923
    Date de naissance : La valeur est à la ligne 931
    Numéro de sécu :La valeur est à la ligne 240

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    J'ai trouvé comment récuperer les valeurs souhaitées

    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
     
     
    $filename = "identifiant.php";
     
    $xml=simplexml_load_file("card2.xml") or die("Error: Cannot create object");
     
    echo "Numéro de sécurité sociale :    ";
     
    echo $xml->node->node[1]->node[2]->node[1]->node[0]->node[1]->attr[5]. "<br>"
     
    ;echo "Nom :    ";
     
    echo $xml->node->node[2]->node[1]->node[1]->node[0]->node[0]->attr[5] .  "<br>";
     
    echo "Prénom :    ";
     
    echo $xml->node->node[2]->node[1]->node[1]->node[0]->node[1]->attr[5] .  "<br>";
     
     
    echo "Date de naissance :    ";
    echo $xml->node->node[2]->node[1]->node[1]->node[0]->node[2]->attr[5] .  "<br>";
    ?>
    Maintenant j'aimerais sauvegarder mes valeurs en php pour les rentrer dans un formulaire.. Une idée ?

  16. #16
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je pense qu'on trouve assez détressant de voir une conception du xml comme montré si ce n'est pas à cause d'une abstraction mal conçue de votre part pour déguiser un peu des données en réel... node/node/node ad infinitum ?! C'est peut-être pour ça que xml a reçu tant de mauvaise critique!

    En tout cas, on peut faire comme ça pour être plus générique dans le sens qu'il est moins contingent des changements de certain type de conception et de modification et qu'il met plus en valeur d'auto-documentation d'un document xml.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $nodelist=$xml->xpath("//node[normalize-space(attr[@name='label'])='Numéro de sécurité sociale']/attr[@name='alt']");
    $v=$nodelist?$nodelist[0]:null;
    echo 'Numéro de sécurité sociale: '.$v.'<br />';
     
    $nodelist=$xml->xpath("//node[normalize-space(attr[@name='label'])='Nom']/attr[@name='alt']");
    $v=$nodelist?$nodelist[0]:null;
    echo 'Nom: '.$v.'<br />';
     
    $nodelist=$xml->xpath("//node[normalize-space(attr[@name='label'])='Prénom']/attr[@name='alt']");
    $v=$nodelist?$nodelist[0]:null;
    echo 'Prénom: '.$v.'<br />';
     
    $nodelist=$xml->xpath("//node[normalize-space(attr[@name='label'])='Date de naissance']/attr[@name='alt']");
    $v=$nodelist?$nodelist[0]:null;
    echo 'Date de naissance: '.$v.'<br />';
    Comme vous voyez une partie de code, malgré etant deux lignes seulement, se répète, si vous voulez, vous pouvez les mettre dans une fonction unique. De tout façon, il met plus en valeur de la technologie xml.

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    Merci Tsuji pour votre réponse ainsi que de la vraie structure xml

    Comme vous l'avez remarqué mon code que j'ai mis est un code que je considère de débutant ( que je suis également ) ayant cherché toutes les informations que j'ai pu trouver sur internet m'a amené sur ce code.

    Peut être une offense pour vous.

    Par ailleurs avez vous une solution pour récupérer les valeurs de Nom, Prénom etc... pour les mettre dans un formulaire sous Wordpress depuis ma page php?

    Utiliser une session ? Methode GET ? POST ?

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

Discussions similaires

  1. [Débutant] récupérer valeur d'un noeud d'un fichier XML
    Par waspy59 dans le forum C#
    Réponses: 10
    Dernier message: 02/12/2016, 17h36
  2. [DOM] Récupérer la valeur d'un noeud XML
    Par sheira dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 16/11/2010, 10h45
  3. Réponses: 2
    Dernier message: 22/12/2008, 18h29
  4. Récupérer la valeur d'un noeud XML
    Par Tchupacabra dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/06/2008, 10h23
  5. incrémenter valeur d'un noeud xml avec javascript
    Par caweb dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/01/2008, 09h52

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