pb récuparation des données dans un fichier xml

Petit nouveau ! | 6 Messages

24 nov. 2006, 23:55

bonjour,
j'ai un petit pb qui me massacre ma soirée qui je pense est tout bete pour certain d'entre vous!...
je veux récuperer les valeurs d'un fichier xml dans un tableau:
j'ai

Code : Tout sélectionner

<candidat> <nom>jo</nom> <prenom>aaa</prenom> </candidat> <candidat> <nom>joki</nom> <prenom>bbb</prenom> </candidat>
j'ai ma fonction qui me "parse" mon fichier:
function lit_xml($fichier,$item,$champs) { 
   // on lit le fichier 
   if($chaine = @implode("",@file($fichier))) { 
      // on explode sur <item> 
      // Dans l'exemple il s'agit de 'profil' 
      $tmp = preg_split("/<\/?".$item.">/",$chaine); 
      // pour chaque <item> donc tous les profils 
      for($i=1;$i<sizeof($tmp)-1;$i+=2) 
         // on lit les champs demandés <champ> donc il s'agit de 'id' et 'prenom' 
         foreach($champs as $champ) { 
            $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
			// on ajoute l'élément au tableau 
            $tmp3[$i-1][]=$tmp2[1];
         } 
		// et on retourne le tableau dans la fonction 
      return $tmp3; 
   } 
} 
et quand je demande la premiere cellule de mon tableau, j'obtient:

Code : Tout sélectionner

array(1)= jo joki array(2)= aaa bbb
et ce n'est pas ce que je veux...

je voudrai un tableau par candidat:
avec pour le candidat1:

Code : Tout sélectionner

array(1)= jo array(2)= aaa
et pour le candidat2:

Code : Tout sélectionner

array(1)= joki array(2)= bbb
j'essayer de modifier la fonction dans tous les sens, que nenni! et je veux faire cette méthode car je sens que c'est faisable
si qqun pouvez m'aider... j'ai honte car je sens que c'est facile mais j'y suis depuis ce matin!
Merci pour l'eventuelle aide.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

25 nov. 2006, 01:12

Il vaudrait mieux que tu utilises une fonction adaptée plutôt que ta recette maison pour parser le XML. Donc à priori DOMXML ou SimpleXML selon ta version de PHP

Petit nouveau ! | 6 Messages

25 nov. 2006, 09:37

ma version de php ne supporte pas le simplexml et j'arrive pas à m'en sortir avec le domxml. je débute partout à la fois en php et xml... et j'ai un peu de mal, pas seulement qu'en voulant parser mon fichier!

Mammouth du PHP | 19672 Messages

25 nov. 2006, 10:42

Tu utilises quelle version de PHP ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

25 nov. 2006, 10:48

je sais pas, j'utilise easyphp 1.8

Mammouth du PHP | 19672 Messages

25 nov. 2006, 10:51

Regarde donc ton phpinfo(), tu dois avoir un lien direct depuis l'icône de la barre des tâches.

Si c'est PHP 4, regarde du coté des fonctions DOM XML
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

25 nov. 2006, 11:44

personne ne sait pour résoudre mon problème avec ma fonction?

Mammouth du PHP | 19672 Messages

25 nov. 2006, 12:00

personne ne sait pour résoudre mon problème avec ma fonction?
Si tu veux un coup de main, il faudrait répondre aux questions : on ne traite pas un fichier XML de la même manière en PHP4 ou en PHP5.

J'ajoute que le fichier XML exemple que tu as montré n'est pas conforme et ça va poser des problèmes lors du traitement par PHP. Pour l'être, il faudrait qu'il ressemble davantage à ceci :

Code : Tout sélectionner

<?xml version="1.0" encoding="iso-8859-1"?> <candidats> <candidat> <nom>jo</nom> <prenom>aaa</prenom> </candidat> <candidat> <nom>joki</nom> <prenom>bbb</prenom> </candidat> </candidats>
Enfin pour terminer, si tu utilises le "@" dans ton PHP pour masquer les erreurs, comment veux-tu pouvoir corriger quoique ce soit qui serait faux ? Vire ces trucs et laisse afficher les erreurs pour les corriger s'il y en a.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

25 nov. 2006, 12:38

mon idée serait de résoudre mon pb avec cette fonction, ce n'est pas le fait que ce soit du xml, et la version de php... Mon intervention est plutot sur le plan algorithmique de ma fonction... qui ne tourne pas comme je voudrais, je sais bien qu'il existe d'autres méthodes mais j'aimerai bien exploiter celle là!
pour le fichier xml, il est valide ce qui est présenter plus haut et un extrait, et la version de php diffère entre chez moi, et la fac qui est en retard sur la technologie!

Mammouth du PHP | 19672 Messages

26 nov. 2006, 00:46

Sur la base du fichier xml tel que je l'ai indiqué plus haut, je me suis livré au test avec le code suivant : le résultat doit correspondre à ce que tu attends, à tester. :
<?php
function lit_xml($fichier, $item, $champs)
{
    if(file_exists($fichier))
    {
        // on lit le fichier
        if($chaine = implode("", file($fichier)))
        {
            // on explode sur <item>
            // Dans l'exemple il s'agit de 'profil'
            $tmp = preg_split("/<\/?". $item .">/",$chaine);
            // pour chaque <item> donc tous les profils
            for($i = 1; $i < (sizeof($tmp)-1); $i += 2)
            {
                foreach($champs as $champ)
                {
                    // on lit les champs demandés <champ> donc il s'agit de 'id' et 'prenom'
                    $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
                    // on ajoute l'élément au tableau
                    $tmp3[$i-1][$champ] = $tmp2[1];
                }
            }
            // et on retourne le tableau dans la fonction
            return $tmp3;
        }
    }
    else
    {
        return false;
    }
}

/* Chemin vers le fichier XML */
$fichier = "./fichier.xml";
/* Nom de la balise racine pour chaque candidat recherché dans le fichier */
$rech1   = "candidat";
/* Tableau des éléments à ressortir */
$rech2   = array("nom", "prenom");

/* Appel de la fonction et récupération des résultats */
$candidats = lit_xml($fichier, $rech1, $rech2);
if(false !== $candidats)
{
    $nb = count($candidats);
    $nbc = count($rech2);
    
    /* Affichage du tableau (déboguage.) */
    echo("<pre>\n");
    var_dump($candidats);
    echo("</pre>\n");
?>

<table summary=""  style="border-collapse: collapse; width: 300px;">
<caption style="border: 1px solid #000; ">Liste des candidats</caption>
<?php
    $i = 1;
    foreach($candidats as $cle => $tab)
    {
    ?>
  <tr>
    <td style="border: 1px solid #000"><?php echo($i); ?></td>
<?php
        for($j = 0; $j < $nbc; $j++)
        {
    ?>
    <td style="border: 1px solid #000"><?php echo($rech2[$j] ." : ". $candidats[$cle][$rech2[$j]]); ?></td>
<?php
        }
?>
  </tr>
<?php
        $i++;
    }
?>
</table>
<?php
}
else
{
?>
<h3 style="color: #f00; background-color: inherit">Le fichier demandé (<?php echo($fichier); ?>) n'existe pas</h3>
<?php
}
?>
Enjoy ! ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 1380 Messages

26 nov. 2006, 11:44

bonjour,
j'ai un petit pb qui me massacre ma soirée qui je pense est tout bete pour certain d'entre vous!....
Parser du XML avec les fonctions natives de PHP pour des raisons de portabilité n'est jamais "tout bête". Il faut retrousser ses manches et jongler avec les indices de tableaux.

Solution qui marchera pour PHP 3 >= 3.0.8, PHP 4, PHP 5
$txt = '
<taBdd>
  <candidat> 
    <nom>jo</nom> 
    <prenom>aaa</prenom> 
  </candidat> 
  <candidat> 
    <nom>joki</nom> 
    <prenom>bbb</prenom>
    <adresse>1 rue de la nation</adresse>
    <localite>Bruxelles</localite>
  </candidat>
</taBdd>';

$p = xml_parser_create();
xml_parse_into_struct($p, $txt, $vals, $index);
xml_parser_free($p);

$countVals = count($vals);
for ($i = 0; $i < $countVals; $i++){
  if ($vals[$i]['tag'] == 'CANDIDAT' && $vals[$i]['type'] == 'open'){
    while (!($vals[$i]['tag'] == 'CANDIDAT' && $vals[$i]['type'] == 'close')){
      if ($vals[$i]['tag'] != 'CANDIDAT' && $vals[$i]['type'] == 'complete'){
        $tmp[$vals[$i]['tag']] = $vals[$i]['value'];
      }
      $i++;
    }
  $sortie[] = $tmp;
  }
}

print_r($sortie);
Pour que ça marche il faut que tu rajoutes les balises XML parents pour ta base de donnée. Dans l'exemple j'ai mis <taBdd>. Avantage de cette solution: on peut avoir un nombre de champs variable.

Oui, je sais que je ne réponds pas à la question et que tu aimerais corriger ton algo mais dis-toi qu'un preg_split fait exactement ce que fait la fonction xml_parse_into_struct(). Mais en moins bien car les niveaux de profondeur de la structure XML ne sont pas gérés.

Et puis, si tu parses du XML ou HTML ou bbCode avec des regex, tu vas ramasser Hubert Roksor sur le dos et il va te dire que tu vas te tirer dans le pied ou une autre partie de ton anatomie, je ne me rappelle plus... :wink:
ripat