Afficher une position spécifique

Petit nouveau ! | 4 Messages

26 oct. 2009, 12:39

Bonjour à tous,

Absolument nul en programmation, je me demandais si quelqu'un pouvait simplement me donner une petite piste pour un travail que je dois faire. Il s'agit d'un classement venant d'un site. Je dois récupérer le flux xml et mettre en page celui-ci dans un tableau.

Actuellement le fichier xml ressemble à ceci
<?xml version="1.0" encoding="iso-8859-1"?>
<Parameter>
<Season>2010</Season>
<LastDate>2009.10.26</LastDate>
<LeagueID>2</LeagueID>
</Parameter>
<Teams>
<Team>
<Pos>1</Pos>
<TeamID>103143</TeamID>
<TeamName>Calais</TeamName>
<Games>12</Games>
<Points>32</Points>
</Team>
<Team>
<Pos>2</Pos>
<TeamID>103139</TeamID>
<TeamName>Bordeaux</TeamName>
<Games>13</Games>
<Points>26</Points>
</Team>
<Team>
<Pos>3</Pos>
<TeamID>103142</TeamID>
<TeamName>Réunion</TeamName>
<Games>12</Games>
<Points>24</Points>
</Team>
<Team>
<Pos>4</Pos>
<TeamID>103144</TeamID>
<TeamName>Tremblay</TeamName>
<Games>13</Games>
<Points>23</Points>
</Team>
</Teams>
Mon php est ainsi :
<?php
$xml = simplexml_load_file("test.xml") 
       or die("Erreur: Le flux est inaccessible");

foreach($xml->children() as $Teams){
	foreach($Teams->children() as $Team => $data){
	  echo $data->Pos;
	  echo $data->TeamName;
	  echo $data->Games;
echo $data ->Points
}
}
?>
Ce php permet de voir les données demandées en vrac (sans aucun style).

J'aimerai donc pouvoir extraire les données des lignes (en fait par équipe) pour pouvoir faire des "echo" dans un tableau et je ne sais vraiment pas par où commencer. De plus, est-il possible qu'une équipe soit toujours en gras, et ceci bien sûr indépendamment de son classement.

Merci d'avance pour m'avoir lu et pour éventuellement me donner un petit coup de main.

Mogwai

ViPHP
ViPHP | 1136 Messages

26 oct. 2009, 16:57

Salut ,

SimpleXML est simple pratique et répond à tes besoins .

voivi un lien vers la documentation associée : http://fr2.php.net/manual/fr/function.s ... d-file.php

Good luck ,
Ch.

Petit nouveau ! | 4 Messages

26 oct. 2009, 19:31

Je vais regarder tout cela, merci infiniment !

Bonne soirée

Mammouth du PHP | 2937 Messages

26 oct. 2009, 23:38

Ton XML est mal formé : il doit y avoir un élément racine qui englobe l'ensemble des données. J'ai corrigé (et indenté) ton XML comme suit :

Code : Tout sélectionner

<?xml version="1.0" encoding="utf-8"?> <Results> <Parameter> <Season>2010</Season> <LastDate>2009.10.26</LastDate> <LeagueID>2</LeagueID> </Parameter> <Teams> <Team> <Pos>1</Pos> <TeamID>103143</TeamID> <TeamName>Calais</TeamName> <Games>12</Games> <Points>32</Points> </Team> <Team> <Pos>2</Pos> <TeamID>103139</TeamID> <TeamName>Bordeaux</TeamName> <Games>13</Games> <Points>26</Points> </Team> <Team> <Pos>3</Pos> <TeamID>103142</TeamID> <TeamName>Réunion</TeamName> <Games>12</Games> <Points>24</Points> </Team> <Team> <Pos>4</Pos> <TeamID>103144</TeamID> <TeamName>Tremblay</TeamName> <Games>13</Games> <Points>23</Points> </Team> </Teams> </Results>
Quant à l'affichage, procède comme suit :
<?php
$xml = simplexml_load_file ('test.xml');
// Le XML n'est pas chargé : on affiche un message d'erreur
if ($xml === false):
?>
<p>Erreur&nbsp;: le flux est inaccessible</p>
<?php
// Le XML est chargé
else:
?>
<table>
  <!-- On récupère le nœud affichant le millésime de la saison -->
  <caption>Résultats de la saison <?php echo $xml -> Parameter[0] -> Season ?></caption>
  <!-- On code les cellules d'en-tête du tableau -->
  <thead>
    <tr>
      <th scope="col">Position</th>
      <th scope="col">Équipe</th>
      <th scope="col">Parties</th>
      <th scope="col">Points</th>
    </tr>
  </thead>
  <tbody>
<?php
  // On parcourt le XML de façon à récupérer les nœuds Team
  $team = $xml -> Teams[0] -> Team;

  // On effectue une boucle foreach sur le tableau retourné par la variable $team
  foreach ($team as $value):
?>
    <tr>
      <!-- On affiche la position -->
      <td><?php echo $value -> Pos ?></td>
      <!-- On affiche la nom de l'équipe -->
      <td><?php echo $value -> TeamName ?></td>
      <!-- On affiche le nombre de parties jouées -->
      <td><?php echo $value -> Games ?></td>
      <!-- On affiche les points -->
      <td><?php echo $value -> Points ?></td>
    </tr>
<?php
  endforeach;
?>
  </tbody>
</table>
<?php
endif;
?>
Soit dit en passant, pour le fichier XML, j'ai changé le codage : en effet, les données reçues et envoyées dans SimpleXML sont codées en UTF-8.

Petit nouveau ! | 4 Messages

27 oct. 2009, 09:33

Victor,

Je ne sais pas comment te remercier, je ne m'en sortais pas. Et génial pour le php commenté !
Je vais ouvrir une bouteille et la boire en ton honneur, promis.

Merci, merci, merci !

P.S : Juste pour ma compréhension, comment pourrais-je sortir par exemple juste la ligne avec le troisième du classement ? (En fait le team qui est en pos 3 j'arrive pas à comprendre comment faire )

Mammouth du PHP | 2937 Messages

27 oct. 2009, 09:57

P.S : Juste pour ma compréhension, comment pourrais-je sortir par exemple juste la ligne avec le troisième du classement ? (En fait le team qui est en pos 3 j'arrive pas à comprendre comment faire )
Si ton XML trie déjà tes équipes par ordre de classement, tu peux accéder directement au nœud de la troisième position comme suit :
// Chargement du XML
$xml = simplexml_load_file ('test.xml');
// On veut accéder au troisième élément Team (le principe est le même que pour accéder à un index précis d'un tableau)
$team = $xml -> Teams -> Team[2];
Sinon, tu peux procéder à une vérification, comme suit :
// Chargement du XML
$xml = simplexml_load_file ('test.xml');
// On récupère tous les éléments Team
$team = $xml -> Teams -> Team;
// On y effectue une boucle
foreach ($team as $value)
{
  // Si l'élément Team actuellement parcouru comporte un élément Pos dont la valeur est 3
  // le (int) permet de forcer le typage (en l'absence d'instruction echo, les nœuds XML sont traités comme des objets)
  if ((int) $value -> Pos == 3)
  {
    // On applique ici les instructions que l'on veut
    // Une fois les instructions définies, on sort de la boucle
    break;
  }
}

Petit nouveau ! | 4 Messages

03 nov. 2009, 10:41

Bonjour,

Mon site marche nickel à la suite vos conseils. J'ai tout de même encore trois petites incompréhensions.

1) Le serveur qui me donne les données xml code les dates en version américaines (2009.12.22 par exemple). Je ne peux pas agir dessus. Existe-il une façon de "retourner" les dates

2) J'aimerais qu'une équipe spécifique sorte du classement, comment faire comprendre à simplexml que l'équipe xxx sera toujours en gras par exemple, quoi que soit son classement.

3) Si une équipe a un nom très long (Les Estuaires de Normandie) peut-on demander à simplexml de remplacer ce nom par "LEDN" par exemple.

Merci d'avance de vos conseils avisés...

Mogwai

Mammouth du PHP | 991 Messages

04 nov. 2009, 18:41

Bonjour,

Mon site marche nickel à la suite vos conseils. J'ai tout de même encore trois petites incompréhensions.

1) Le serveur qui me donne les données xml code les dates en version américaines (2009.12.22 par exemple). Je ne peux pas agir dessus. Existe-il une façon de "retourner" les dates

2) J'aimerais qu'une équipe spécifique sorte du classement, comment faire comprendre à simplexml que l'équipe xxx sera toujours en gras par exemple, quoi que soit son classement.

3) Si une équipe a un nom très long (Les Estuaires de Normandie) peut-on demander à simplexml de remplacer ce nom par "LEDN" par exemple.

Merci d'avance de vos conseils avisés...

Mogwai
Pour ta derniere question on peut imaginer une fonction du genre :
<?php
function format_nom($string)
{
	if (strlen($string) > 10) // 10 pour la longeur de mot
	{
		$stringDecompose = explode(' ' , $string); // Décompose mot par mot , en découpant avec un espace
		$return = '';
		foreach ($stringDecompose as $value)
		{
			$return .= strtoupper($value[0]); // Récupère la premieres lettres
		}
		return $return;
	}
	else
	{
		return $string
	}
}
?>
La fonction n'est pas parfaite mais bon ;) on a de multiple possiblité on peut au lieu de compter les lettres , plutot les mots ;)

Bye Hawk
DevOps, Symfony4, Hoa