[RESOLU] XML : recuperer balises identiques

Eléphanteau du PHP | 37 Messages

08 avr. 2010, 09:57

Bonjour,

Afin d'extraire les données d'un XML, et les stocker dans une base MySql, je parcours le fichier XML avec SimpleXml.
Ca va plutôt bien, sauf pour une balise dont le nom se répête, et pour laquelle je ne parviens à relever qu'une occurence, malgré une boucle foreach.

Ci dessous une partie du XML :
<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>
On voit ici la balise <critere>. Pas de soucis, je récupère tout.
Pour la balise <code-valeur-critere>, je ne récupère que la première valeur... Et ca me pèse un peu.

Code :
<?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>";  
	
	$criteres=$variable->critere; 
 	foreach($criteres as $crit){ 
		$code_critere=$crit ->{"code-critere"};echo "VERIF code_critere : ".$code_critere."<br>"; 
		$code_valeur_critere=$crit->{"code-valeur-critere"};echo "VERIF code_valeur_critere : ".$code_valeur_critere."<br>";  
	} 
echo "<hr>"; 
}
?>
Extrait du résultat :
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
VERIF code_critere : GCAUT
VERIF code_valeur_critere : GCAUTI
VERIF code_critere : GCHARG
VERIF code_valeur_critere : GCHARG
En principe, je pensais voir toutes les valeurs de <code-valeur-critere>. Mais non. Uniquement la première. Et je ne vois pas bien comment faire une nouvelle boucle à cet endroit.
Si quelqu'un pouvait m'orienter, je suis preneur !
Merci.
-- Ecumastor

ViPHP
ViPHP | 5462 Messages

08 avr. 2010, 10:38

t'as une 3ème boucle a faire (par contre j'ai un doute sur l'utilité de la premiere
	
$fichier_xml     = "data.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/>";  
        }
    }
}

Eléphanteau du PHP | 37 Messages

08 avr. 2010, 10:52

Rhâââââ j'enrage, c'était pourtant simple...
Merci Stealth35 ! Ca m'enlève une belle épine du pied. :D
J'ai saisi ta manière de faire, et je n'avais pas pensé à ça.
Cette fois ça marche.
VERIF code_prestataire : GS024
VERIF code : C933A
VERIF code_critere : GSBNB2
VERIF code_valeur_critere : GSBNB2
VERIF code_valeur_critere : GWCNB2
VERIF code_valeur_critere : GSBNB2
VERIF code_critere : GCHNBR
VERIF code_valeur_critere : GCHNBR
VERIF code_valeur_critere : GCHNB6
Je vois mes <code-valeur-critere> !
Merci.
-- Ecumastor

Eléphanteau du PHP | 37 Messages

08 avr. 2010, 16:32

Bon, ben y'a encore un souci...
Dans mon XML, une valeur se balade :
<critere>
<code-critere>GCHAM6</code-critere>
<code-valeur-critere>GCH6L2</code-valeur-critere>
<valeur>1</valeur>
<code-valeur-critere>GCH6ET</code-valeur-critere>
</critere>
Avec l'aide de stealth35, je suis parvenu à afficher toutes les valeurs de <code-valeur-critere>, mais également les autres, en fait le code me range toutes les variables de <critere> ensemble, sous la même variable.

Dans l'extrait, 1 se rapporte à GCH6L2, avec GCH6L2 signifiant "chambre avec lit 2 places".
Je sais, je sais, ce XML est vachement simple...

Donc mon problème : je dois pouvoir dire
Si <valeur> existe et suit immédiatement <code-valeur-critere> alors ma variable $afficher vaudra "<valeur> <code-valeur-critere>" ; restera ensuite à remplacer <code-valeur-critere> par "chambre avec lit 2 places".
D'où $afficher="1 chambre avec lit 2 places". :roll:

Ouf ! Là c'est pas simple...
J'ai commencé à m'embrouiller avec des tableaux, valeur n, valeur n-1... Mais il y a sans doute moyen de faire ressortir la valeur de <valeur>.
J'en suis pas avec mon premier XML, mais pour les autres, les balises comportaient soit des attributs, soit des noms différents... C'était plus simple à mon niveau !
-- Ecumastor