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 :

comment trouver la valeur d'un champ d'une chaine de caractère en XML qui est mal structurée


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut comment trouver la valeur d'un champ d'une chaine de caractère en XML qui est mal structurée
    Bonjour,
    je reçois par un web service

    soit
    <?xml version="1.0" encoding="utf-8"?><transaction success="false">
    <!--Here is the information from webService-->
    <success>false</success>
    soit
    <?xml version="1.0" encoding="utf-8"?><transaction success="true">
    <!--Here is the information from webService-->
    <success>true</success>

    Il faut que je trouve la valeur "false" ou "true" dans <success>
    Ce que je fais :
    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
    34
    35
    36
    /*
    $info = curl_getinfo($curl);
    $recu = $response;																
    */								
     
    $recuTest = '<?xml version="1.0" encoding="utf-8"?><transaction success="false">
    <!--Here is the information from webService-->
    <isSuccess>false</isSuccess>';
    $docDom = new DOMDocument();
    $docDom->loadXML($recuTest);                 /////////// on line 11
     
    echo $docDom->saveXML();
     
     
    $trouver =  $docDom->getElementsByTagName('isSuccess');
     
     
     
     
    echo '---<br>';
     
    foreach ($trouver as $val) {
        echo $val->nodeValue, PHP_EOL;
     
    		if (($val->nodeValue) == 'false')
    		{
    			echo "<p>faux</p>";
    			//donc je peux traiter pour cette condition : alert par email
    		}
    		else
    		{
    			echo "<p>vrai</p>";
    			//donc je peux traiter pour cette condition : tout va bien
    		}
     
    	}
    et voici le message d'erreur :
    Warning: DOMDocument::loadXML(): Premature end of data in tag transaction line 1 in Entity, line: 3 in E:\sites\rep_ws.php on line 11
    Par contre lorsque je supprime 1re ligne dans ma variable "$recuTest" tout marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $recuTest = '
    <!--Here is the information from webService-->
    <isSuccess>false</isSuccess>';
    voici ce que je vois sans erreur :
    <?xml version="1.0"?>
    <!--Here is the information from webService-->
    <isSuccess>false</isSuccess>
    ---<br>false
    <p>faux</p>
    Que je dois faire ?
    Comment je peux trouver la valeur de <success> lorsque je reçois les informations comme cela :
    '<?xml version="1.0" encoding="utf-8"?><transaction success="false">
    <!--Here is the information from webService-->
    <isSuccess>false</isSuccess>
    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut
    J'ai une solution, mais pas très belle : par la fonction ""
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $a_supprimer = '<?xml version="1.0" encoding="utf-8"?><transaction success="false">';
    $remplacer_par = '';
     
    $recuTest = str_replace($a_supprimer, $remplacer_par, $recuTest);
    Mais, un jour, si le web service change quelque chose (un chiffre ou caractère) dans la variable "$recuTest", ma solution ne marchera plus puisque la variable, "$a_supprimer ", ne contiendra plus de bonne valeur

    Est-ce que vous avez une autre idée ?

    Merci

    Voici le code actuel :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    /*
    $info = curl_getinfo($curl);
    $recu = $response;																
    */								
     
    $recuTest = '<?xml version="1.0" encoding="utf-8"?><transaction success="false">
    <!--Here is the information from webService-->
    <isSuccess>false</isSuccess>';
     
    $a_supprimer = '<?xml version="1.0" encoding="utf-8"?><transaction success="false">';
    $remplacer_par = '';
     
    $recuTest = str_replace($a_supprimer, $remplacer_par, $recuTest);
     
    $docDom = new DOMDocument();
    $docDom->loadXML($recuTest);
     
    echo $docDom->saveXML();
     
     
    $trouver =  $docDom->getElementsByTagName('isSuccess');
     
     
     
     
    echo '---<br>';
     
    foreach ($trouver as $val) {
        echo $val->nodeValue, PHP_EOL;
     
    		if (($val->nodeValue) == 'false')
    		{
    			echo "<p>faux</p>";
    			//donc je peux traiter pour cette condition : alert par email
    		}
    		else
    		{
    			echo "<p>vrai</p>";
    			//donc je peux traiter pour cette condition : tout va bien
    		}
     
    	}

  3. #3
    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
    Par défaut
    A partir du moment ou le XML est mal formaté, je ne sais pas si cela vaut la peine de s’embêter a vouloir le lire comme du XML (surtout vu sa taille).
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut
    Bonjour sabotage,
    Ok, je ne suis pas obligé de lire comme du XML comme tu dis.

    Alors à quelle façon puis-je lire pour trouver si "success" est "false" ou "true" ?

  5. #5
    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
    Par défaut
    La manière la plus simple est de chercher "<isSuccess>true</isSuccess>" dans le contenu.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut
    Merci sabotage,

    Citation Envoyé par sabotage Voir le message
    La manière la plus simple est de chercher "<isSuccess>true</isSuccess>" dans le contenu.
    Est-ce que je les cherche avec la fonction : "strpos" ?

    Voici ce que je fais :
    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
    34
    35
    $recuTest = '<?xml version="1.0" encoding="utf-8"?><transaction success="true">
    <!--Here is the information from webService-->
    <isSuccess>true</isSuccess>';
     
     
     
    $trouver   = '<transaction success="true">';
    $result = strpos($recuTest, $trouver);
     
    if ($result == true) 
    	{
    		echo "<p>c'est vrai</p>";
    				//donc je peux traiter pour cette condition : tout va bien
    	} 
    else
    	{
    		echo "<p>c'est faux</p>";
    				//donc je peux traiter pour cette condition : alert par email
    	}
     
     
     
    $trouverXml   = '<isSuccess>true</isSuccess>';
    $resultXml = strpos($recuTest, $trouverXml);
     
    if ($resultXml == true) 
    	{
    		echo "<p>2e : c'est vrai</p>";
    				//donc je peux traiter pour cette condition : tout va bien
    	} 
    else
    	{
    		echo "<p>2e c'est faux</p>";
    				//donc je peux traiter pour cette condition : alert par email
    	}
    Est-ce que c'est bon ou bien il y a une autre meilleure solution que la mienne ?

    Merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/03/2012, 19h35
  2. Comment récupérer la valeur d'un champ d'une fenêtre modale
    Par lodan dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/09/2011, 18h02
  3. Extraire des champs dans une chaine de caractère
    Par clemuche dans le forum Requêtes
    Réponses: 1
    Dernier message: 25/02/2009, 23h24
  4. Réponses: 2
    Dernier message: 28/03/2008, 18h24
  5. Réponses: 4
    Dernier message: 18/07/2007, 14h10

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