Bonjour à tous.

Je ne parviens pas à extraire toutes les variables d'un fichier xml, dont les noms de balises se répètent, et ce malgré une boucle "foreach".
Ci-dessous un extrait du fichier XML qui est en réalité beaucoup plus long mais de forme récurrente :

<prestations>
<nb-prestations-total>364</nb-prestations-total>

<prestation cle="G|GS024|C933A">
<type-prestataire>G</type-prestataire>
<code-prestataire>GS024</code-prestataire>
<code>C933A</code>

<critere>
<code-critere>GSBNB2</code-critere>
<code-valeur-critere>GWCNB2</code-valeur-critere>
<code-valeur-critere>GSBNB2</code-valeur-critere>
</critere>

<critere>
<code-critere>GSDB3</code-critere>
<code-valeur-critere>G1DWC1</code-valeur-critere>
<code-valeur-critere>GWCB1</code-valeur-critere>
<code-valeur-critere>GSAET</code-valeur-critere>
</critere>

<critere>
<code-critere>GCHAM6</code-critere>
<code-valeur-critere>GCH6L2</code-valeur-critere>
<valeur>1</valeur>
<code-valeur-critere>GCH6ET</code-valeur-critere>
</critere>

<critere>
<code-critere>GCHAM5</code-critere>
<code-valeur-critere>GCH5SP</code-valeur-critere>
<code-valeur-critere>GCH5ET</code-valeur-critere>
</critere>

<critere>
<code-critere>GCHAM4</code-critere>
<code-valeur-critere>GC412P</code-valeur-critere>
<valeur>1</valeur>
<code-valeur-critere>GCH4RS</code-valeur-critere>
</critere>

<critere>
<code-critere>GEQUCU</code-critere>
<code-valeur-critere>GQAVEV</code-valeur-critere>
<code-valeur-critere>GFOURO</code-valeur-critere>
</critere>

<critere>
<code-critere>GEQUSE</code-critere>
<code-valeur-critere>GETEP</code-valeur-critere>
<code-valeur-critere>GESEL</code-valeur-critere>
<code-valeur-critere>GELAL</code-valeur-critere>
<code-valeur-critere>GODVD</code-valeur-critere>
<code-valeur-critere>GEQRTV</code-valeur-critere>
</critere>

</prestation>
</prestations>

Pour afficher, et stocker dans une base de données les variables "code-critere" et "code-valeur-critere", j'ai fait le programme suivant en php :

<?php
$fichier_xml ="test_xml.xml";

$xml = simplexml_load_file($fichier_xml);
$variable = ($xml->prestation);
foreach ($variable as $variable) {
$code_prestataire=$variable->{'code-prestataire'};echo"VERIF code_prestataire : ".$code_prestataire."<br>";
$code=$variable->code;echo"VERIF code : ".$code."<br>";

foreach ($variable->critere->{'code-critere'} as $crit) {
$code_critere=$crit;
echo"VERIF code_critere : ".$code_critere."<br>";
}

foreach ($variable->critere->{'code-valeur-critere'} as $crit) {
$code_valeur_critere=$crit;
echo"VERIF code_valeur_critere : ".$code_valeur_critere."<br>";
}

echo"<hr>";
}
?>

Ce programme fonctionne, mais ne me donne que les valeurs de la première occurence de <critere>, pas les autres. Pourtant avec une boucle "foreach", il devrait lire l'ensemble du XML...

Voici le résultat dans le navigateur :

VERIF code_prestataire : GS024
VERIF code : C933A
VERIF code_critere : GSBNB2
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2

VERIF code_prestataire : G0009
VERIF code : A100A
VERIF code_critere : GNOTE2
VERIF code_valeur_critere : GLINGE

... et voilà... il liste les "code-valeur-critere" du premier <critere> et s'arrête là...
Quelqu'un aurait-il-une idée ? Ca fait un moment que je galère là dessus...

David.
Salut,

Essaie de procéder comme suit :
$fichier_xml = 'test_xml.xml';

$xml = simplexml_load_file ($fichier_xml);
$variable = $xml -> prestation;
foreach ($variable as $variable)
{
  $code_prestataire = $variable -> {'code-prestataire'};
  $code = $variable -> code;
  echo 'VERIF code_prestataire : '.$code_prestataire.'<br>';
  echo 'VERIF code : '.$code.'<br>';

  // Sélection des éléments critere
  $criteres = $variable -> critere;

  // Boucle sur le tableau retourné par $criteres
  foreach ($criteres as $crit)
  {
    // À l'intérieur de la boucle, on sélectionne les éléments code-critere et code-valeur-critere (on fait ainsi l'économie d'une boucle)
    $code_critere = $crit -> {'code-critere'};
    $code_valeur_critere = $crit -> {'code-valeur-critere'};
    echo 'VERIF code_valeur_critere : '.$code_valeur_critere.'<br>';
    echo 'VERIF code_critere : '.$code_critere.'<br>';
  }
  echo '<hr>';
}
Merci Victor !

Tu as résolu une partie du problème, et je ne pensais pas avoir une réponse aussi rapidement ! Smiley biggrin
Le code que tu as écrit liste tous les "code-critere", et toutes les premières valeurs des "code-valeur-critere".

Extrait à l'écran :
VERIF code_prestataire : GS024
VERIF code : C933A
VERIF code_critere : GSBNB2
VERIF code_valeur_critere : GWCNB2
VERIF code_critere : GCHNBR
VERIF code_valeur_critere : GCHNB6
VERIF code_critere : GINCVS
VERIF code_valeur_critere : GCHH30
... etc ... etc

Faut-il faire une autre boucle foreach dans <critere> pour lister les cas où les balises <code-valeur-critere> sont groupées ?

<critere>
<code-critere>GSDB3</code-critere>
<code-valeur-critere>G1DWC1</code-valeur-critere>
<code-valeur-critere>GWCB1</code-valeur-critere>
<code-valeur-critere>GSAET</code-valeur-critere>
</critere>

Ici il y en a trois.
Ton script voit ça :
<code-critere>GSDB3</code-critere>
<code-valeur-critere>G1DWC1</code-valeur-critere>
... pas les deux autres.

Je vais essayer avec foreach.

Et merci beaucoup de ta réponse, Victor.

David.
OK alors puisque j'ai plusieurs variables <sous-valeur-critere> à l'interieur de <critere>, j'ai fait une boucle selon ton modèle :


<?php
$fichier_xml = 'test_xml.xml';

$xml = simplexml_load_file ($fichier_xml);
$variable = $xml -> prestation;
foreach ($variable as $variable){
$code_prestataire = $variable -> {'code-prestataire'};
$code = $variable -> code;
echo 'VERIF code_prestataire : '.$code_prestataire.'<br>';
echo 'VERIF code : '.$code.'<br>';

// Sélection des éléments critere
$criteres = $variable -> critere;

// Boucle sur le tableau retourné par $criteres
foreach ($criteres as $crit) {
// À l'intérieur de la boucle, on sélectionne les éléments code-critere et code-valeur-critere (on fait ainsi l'économie d'une boucle)
$code_critere = $crit -> {'code-critere'};
echo 'VERIF code_critere : '.$code_critere.'<br>';

$sous_criteres = $variable -> critere -> {'code-valeur-critere'};

foreach ($sous_criteres as $crit) {
$code_valeur_critere = $crit;
echo"VERIF code_valeur_critere : ".$code_valeur_critere."<br>";
}

echo '<hr>';
}
}
?>


Mais en résultat, j'ai ça :

VERIF code_prestataire : GS024
VERIF code : C933A
VERIF code_critere : GSBNB2
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2

VERIF code_critere : GCHNBR
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2

VERIF code_critere : GINCVS
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2

VERIF code_critere : GCAUT
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2

Le script isole bien les <critere>, mais me répète à chaque occurence de <critere> les deux mêmes valeurs : GWCNB2 et GSBNB2.
Je ne comprends pas pourquoi il reste bloqué là dessus, alors que les valeurs changent à chaque fois...
Hello ecumastor et bienvenue Smiley smile ,

En tant que modérateur, je me dois de te faire remarquer que tu n'as malheureusement pas respecté l'une des Règles de base du forum qui est d'afficher les codes et exemples proprement à l'aide des boutons [ code]... ici ton code HTML, CSS, PHP, etc.[ /code] (sans espace après le crochet ouvrant).

upload/1-code.gif

Je te remercie par avance de bien vouloir éditer tes messages afin de les rendre conforme à cette règle. Smiley cligne
D'accord Heyoan, je rédite donc mon message, en utilisant les règles de mises en pages. Je n'avais pas prêté attention à cela...
Sorry...


OK alors puisque j'ai plusieurs variables <sous-valeur-critere> à l'interieur de <critere>, j'ai fait une boucle selon ton modèle :

[code=php]
<?php
$fichier_xml = 'test_xml.xml';

$xml = simplexml_load_file ($fichier_xml);
$variable = $xml -> prestation;
foreach ($variable as $variable){
$code_prestataire = $variable -> {'code-prestataire'};
$code = $variable -> code;
echo 'VERIF code_prestataire : '.$code_prestataire.'<br>';
echo 'VERIF code : '.$code.'<br>';

// Sélection des éléments critere
$criteres = $variable -> critere;

// Boucle sur le tableau retourné par $criteres
foreach ($criteres as $crit) {
// À l'intérieur de la boucle, on sélectionne les éléments code-critere et code-valeur-critere (on fait ainsi l'économie d'une boucle)
$code_critere = $crit -> {'code-critere'};
echo 'VERIF code_critere : '.$code_critere.'<br>';

$sous_criteres = $variable -> critere -> {'code-valeur-critere'};

foreach ($sous_criteres as $crit) {
$code_valeur_critere = $crit;
echo"VERIF code_valeur_critere : ".$code_valeur_critere."<br>";
}

echo '<hr>';
}
}
?>


Mais en résultat, j'ai ça :

a écrit :

VERIF code_prestataire : GS024
VERIF code : C933A
VERIF code_critere : GSBNB2
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2

VERIF code_critere : GCHNBR
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2

VERIF code_critere : GINCVS
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2

VERIF code_critere : GCAUT
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2


Le script isole bien les <critere>, mais me répète à chaque occurence de <critere> les deux mêmes valeurs : GWCNB2 et GSBNB2.
Je ne comprends pas pourquoi il reste bloqué là dessus, alors que les valeurs changent à chaque fois...
... zut le code n'est pas passé... je recommence.

OK alors puisque j'ai plusieurs variables <sous-valeur-critere> à l'interieur de <critere>, j'ai fait une boucle selon ton modèle :


<?php
$fichier_xml = 'test_xml.xml';

$xml = simplexml_load_file ($fichier_xml);
$variable = $xml -> prestation;
foreach ($variable as $variable){
$code_prestataire = $variable -> {'code-prestataire'};
$code = $variable -> code;
echo 'VERIF code_prestataire : '.$code_prestataire.'<br>';
echo 'VERIF code : '.$code.'<br>';

// Sélection des éléments critere
$criteres = $variable -> critere;

// Boucle sur le tableau retourné par $criteres
foreach ($criteres as $crit) {
// À l'intérieur de la boucle, on sélectionne les éléments code-critere et code-valeur-critere (on fait ainsi l'économie d'une boucle)
$code_critere = $crit -> {'code-critere'};
echo 'VERIF code_critere : '.$code_critere.'<br>';

$sous_criteres = $variable -> critere -> {'code-valeur-critere'};

foreach ($sous_criteres as $crit) {
$code_valeur_critere = $crit;
echo"VERIF code_valeur_critere : ".$code_valeur_critere."<br>";
}

echo '<hr>';
}
}
?>


Mais en résultat, j'ai ça :

a écrit :

VERIF code_prestataire : GS024
VERIF code : C933A
VERIF code_critere : GSBNB2
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2

VERIF code_critere : GCHNBR
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2

VERIF code_critere : GINCVS
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2

VERIF code_critere : GCAUT
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2

Le script isole bien les <critere>, mais me répète à chaque occurence de <critere> les deux mêmes valeurs : GWCNB2 et GSBNB2.
Je ne comprends pas pourquoi il reste bloqué là dessus, alors que les valeurs changent à chaque fois...


On va y arriver !
... et la solution ! (ça pourra servir)
<?      
$fichier_xml     = "test_xml.xml";
$xml             = simplexml_load_file($fichier_xml);
$nodes           = $xml->prestation;

foreach($nodes as $variable){
    $code_prestataire=$variable->{"code-prestataire"};echo"VERIF code_prestataire : ".$code_prestataire."<br/>";
    
    $code = $variable->code;echo"VERIF code : ".$code."<br>";  
      
    $criteres = $variable->critere;
           
    foreach($criteres as $crit){
        $code_critere = $crit->{"code-critere"};
        echo "VERIF code_critere : ".$code_critere."<br/>";
   
        foreach($crit as $crit_val){
            $code_valeur_critere = $crit_val;
            echo "VERIF code_valeur_critere : ".$code_valeur_critere."<br/>";  
        }
    }
}
?>

Modifié par ecumastor (08 Apr 2010 - 11:06)