Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML
XML Forum d'entraide sur XML avec PHP. Exemples : SimpleXML, OpenXML... Avant de poster -> FAQ XML, Cours XML et Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/03/2006, 15h23   #1
Invité de passage
 
Inscription : mars 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 16
Points : 4
Points : 4
Par défaut [EXPAT] Parseur PHP + flux xml

Salut,

Je rencontre un probleme pour récupérer les données d'un flux xml (un flux pour un livescore).
Pour le parser, j'utilise un parser que j'ai trouvé sur le forum (celui de macbook) :
http://www.developpez.net/forums/viewtopic.php?t=458490&highlight=parser+php

Pour afficher les données, j'utilise ce code :
Code :
1
2
3
4
5
6
7
8
9
<?
foreach ($xml['sport'] as $value)
{
	if($value['name'] != ''){ // j'ai ajouté pour éviter l'affichage de ligne blanche...
	echo 'Sport : '.$value['name'].' / Categorie : '.$value['category']['name'].' / Tournoi : '.$xml['tournament']['name'].' / Match : '.$xml['match']['matchdate'].' / Team 1 : '.$xml['match']['team1'].' / Team 2 : '.$xml['match']['team2'].'<br />';
	}
}
?>
<pre><?php print_r($xml) ?></pre>
Et j'obtiens ça :
http://www.smcaen.com/test.html

Je ne sais pas comment récupérer les données pour chaque sport / pays / division / rencontre.

Les noms des différents sports s'affichent correctement... mais comment récupérer les autres données ?

J'aimerais à terme que le livescore ait cette allure :
http://betandwin.enetpulse.com (faites un copier/coller du lien dans votre navigateur sinon ça ne fonctionnera pas).

Merci pour votre aide !
Sam53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2006, 21h24   #2
Membre émérite
 
Avatar de macbook
 
Inscription : février 2006
Messages : 840
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 840
Points : 924
Points : 924
là c'est davantage un problème de manipulation de tableau que de parsage.

Si tu n'es pas coutumier des tableaux multidimensionnels, commences par parcourir ton tableau avec un foreach, et de descendre petit à petit dans ton tableau en récupérant le nom des indices.
__________________
Consultant idéaliste.
macbook est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2006, 23h27   #3
Invité de passage
 
Inscription : mars 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 16
Points : 4
Points : 4
Citation:
Envoyé par macbook
là c'est davantage un problème de manipulation de tableau que de parsage.

Si tu n'es pas coutumier des tableaux multidimensionnels, commences par parcourir ton tableau avec un foreach, et de descendre petit à petit dans ton tableau en récupérant le nom des indices.
Oui en effet ! Le problème, c'est que je ne sais pas faire ça :p Mais je ne demande qu'à apprendre

Lorsque l'on fait un :
foreach ($xml['sport'] as $value) {
...
}
Cela parcours les données du tableau jusqu'à ou ?

Comment faire pour récupérer toutes les données de chaque catégorie ?
Je ne sais pas comment m'y prendre.
Sam53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2006, 23h44   #4
Nouveau Membre du Club
 
Inscription : octobre 2003
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 59
Points : 33
Points : 33
salut Samuel

foreach permet de parcourir les elements d'un seul tableau.
toi, tu possède, un tableau dans un tableau dans un tableau dans un tableau.

tu doit donc faire un foreach dans un foreach dans un foreach.

n'oubli pas que print_r est ton amis[code]<?php
echo '<pre>'.htmlentities(print_r($xml,true)).'</pre>';

abuse-en, tu risque de trouver la solution tout seul...
moechofe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 13h31   #5
Invité de passage
 
Inscription : mars 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 16
Points : 4
Points : 4
Je viens de comprendre le principe des tableaux multidimensionnels. En tout cas, je sais comment récupérer telle ou telle valeur .

Exemple pour le premier enregistrement, du premier sport, de la première catégorie, de la première division, du premier match :

Code :
1
2
3
4
5
6
7
if(!empty($xml['sport'][0]['name']))
{
echo 'Sport (sport id :'.$xml['sport'][0]['attributes']['mssportid'].') : '.$xml['sport'][0]['name'].' / ';
echo 'Categorie (categorie id : '.$xml['sport'][0]['category'][0]['attributes']['mscategoryid'].') : '.$xml['sport'][0]['category'][0]['name'].' / ';
echo 'Division (division id : '.$xml['sport'][0]['category'][0]['tournament']['attributes']['mstournamentid'].') : '.$xml['sport'][0]['category'][0]['tournament']['name'].' / ';
echo 'Match (le '.$xml['sport'][0]['category'][0]['tournament']['match']['matchdate'].') : '.$xml['sport'][0]['category'][0]['tournament']['match']['team1'].' vs '.$xml['sport'][0]['category'][0]['tournament']['match']['team2'].'';
}
Maintenant, il faut que je trouve un moyen d'afficher toutes les valeurs pour chaque tableau. J'ai essayé un foreach dans un autre foreach, mais j'ai un message d'erreur :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$i=0;
foreach ($xml['sport'] as $value)
{
	if(!empty($xml['sport'][$i]['name']))
	{
	echo 'Sport (sport id :'.$xml['sport'][$i]['attributes']['mssportid'].') : '.$xml['sport'][$i]['name'].'<br />';


	$j=0;
	foreach ($xml['category'][$i] as $category)
	{
	echo 'Categorie (categorie id : '.$xml['sport'][$i]['category'][$j]['attributes']['mscategoryid'].') : '.$xml['sport'][$i]['category'][$j]['name'].'<br />';
	echo 'Division (division id : '.$xml['sport'][$i]['category'][$j]['tournament']['attributes']['mstournamentid'].') : '.$xml['sport'][$i]['category'][$j]['tournament']['name'].'<br />';
	echo 'Match (le '.$xml['sport'][$i]['category'][$j]['tournament']['match']['matchdate'].') : '.$xml['sport'][$i]['category'][$j]['tournament']['match']['team1'].' vs '.$xml['sport'][$i]['category'][$j]['tournament']['match']['team2'].'<br /><br />';
	$j++;
	} // fin du foreach category

	} // fin du if
$i++;
}
La liste des différents sports s'affiche bien, mais j'ai cette erreur qui s'affiche au niveau de la ligne du second foreach.
J'ai essayé avec foreach ($xml['category'] as $category) sans le [$i] mais ca ne change rien. (PS : je n'ai pas remplacé les valeurs du foreach dans le code... je le ferai après).

Erreur :
Citation:
Warning: Invalid argument supplied for foreach() in c:\program files\easyphp1-8\www\test.php on line 174
(la ligne que j'ai indiqué en rouge).
Sam53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 15h22   #6
Invité de passage
 
Inscription : mars 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 16
Points : 4
Points : 4
Bon, j'ai réussi à ne plus avoir l'erreur.
J'arrive à afficher les différents sports... maintenant j'essai d'afficher les différentes "category" pour chaque sport, mais je n'y arrive pas

mon code actuel :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$i=0;
 
foreach ($xml['sport'] as $value)
{
	if(!empty($xml['sport'][$i]['name']))
	{
	echo 'Sport (sport id :'.$xml['sport'][$i]['attributes']['mssportid'].') : '.$xml['sport'][$i]['name'].'<br />';
 
		$j=0;
		foreach ($xml['sport'][$i]['category'] as $category) // j'ai repris la meme structure que pour le 1er foreach
		{
		echo ''.$xml['sport'][$i]['category'][$j]['name'].'<br />'; // c'est là que ca coince.
		}
		$j++;
	}
 
$i++;
}
Au niveau de la ligne :
echo ''.$xml['sport'][$i]['category'][$j]['name'].'<br />';

Je ne sais pas comment employer les valeurs définies dans le tableau qui sont générées en php. J'utilise $i et $j, mais ca ne fonctionne pas. Il me retourne toujours la meme valeur :
Code X :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sport (sport id :1) : Soccer
Czech
Czech
Czech
Czech
Czech
Czech
Czech
Czech
Czech
Czech
Czech
Czech
Czech
Czech
Czech
Czech

Au niveau du deuxième foreach, seriez vous comment faire en sorte qu'il utiliser les bonne valeurs ? comme ça il affichera les noms de chaque catégorie.
Sam53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 15h27   #7
Nouveau Membre du Club
 
Inscription : octobre 2003
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 59
Points : 33
Points : 33
bah oui mais non

un fois que tu fait
Code :
1
2
3
<?php
foreach ($xml['sport'] as $value)
?>
c'est $value qui contient tout nouveau tableau

donc ton foreach suivant sera
Code :
1
2
3
<?php
foreach($value['category'][$i] as $category)
?>
A adapter bien sur.
moechofe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 15h55   #8
Invité de passage
 
Inscription : mars 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 16
Points : 4
Points : 4
Je viens de remplacer le $xml['sport'] par $value dans tout le code, et ça affiche une notice au lieu des données :

Citation:
Notice: Undefined offset: 0 in c:\program files\easyphp1-8\www\test.php on line 171
Notice: Undefined offset: 1 in c:\program files\easyphp1-8\www\test.php on line 171
etc...
Code :
1
2
3
4
5
6
7
8
9
10
11
12
// Code pour tester l'affichage la liste des sports :
$i=0;
 
foreach ($xml['sport'] as $value)
{
	if(!empty($value[$i]['name']))
	{
	echo ''.$value[$i]['name'].'<br />';
	}
 
$i++;
}
J'ai pourtant bien remplacé comme il le fallait, mais ca fonctionne plus du tout. C'est pour cela que je n'utilisais pas $value ! :p
Sam53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 16h22   #9
Nouveau Membre du Club
 
Inscription : octobre 2003
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 59
Points : 33
Points : 33
essaye
Code :
1
2
3
<?php
echo '<pre>'.htmlentities(print_r($value,true)).'</pre>';
?>
alors ! pour savoir ou tu en est.

si tu souhaite utiliser $xml dans tout tes foreach (pratique pour modier les valeurs) je te conseil d'extraire aussi les cléfs dans le foreach.
moechofe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 17h00   #10
Invité de passage
 
Inscription : mars 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 16
Points : 4
Points : 4
Lorsque je fais un :
Code :
1
2
3
<?php
echo '<pre>'.htmlentities(print_r($value,true)).'</pre>';
?>
Cela m'affiche :
Code X :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Array
(
    [category] => Array
        (
            [tournament] => Array
                (
                    [match] => Array
                        (
                            [0] => 
                        )

                )

        )

)

C'est normal qu'il n'y ait aucune données ?
Sam53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 20h49   #11
Invité de passage
 
Inscription : mars 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 16
Points : 4
Points : 4
Ca y est j'ai réussi à utiliser la valeur $value => $xml['sport'] .

J'en suis à ce stade :
Code :
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
foreach ($xml['sport'] as $value)
{
	if(!empty($value['attributes']['mssportid']))
	{
	echo 'Sport (sport id :'.$value['attributes']['mssportid'].') : '.$value['name'].'<br />';
 
		foreach ($value['category'] as $category)
		{
			if(!empty($category['attributes']['mscategoryid']))
			{
			echo 'Pays (id pays :'.$category['attributes']['mscategoryid'].')'.$category['name'].'<br />';
 
				foreach ($category['tournament'] as $tournament)
				{
					if(!empty($tournament['attributes']['mstournamentid']))
					{
					echo 'Division (id division :'.$tournament['attributes']['mstournamentid'].')'.$tournament['name'].'<br />';
					}	
				}
 
			}	
		}
		echo '<br />';
	}
}
Et le script m'affiche :
Code X :
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
Sport (sport id :1) : Soccer
Pays (id pays :18)Czech
Pays (id pays :1)England
Pays (id pays :7)France
Pays (id pays :30)Germany
Division (id division :44)Regionalliga North
Pays (id pays :67)Greece
Pays (id pays :51)Ireland
Pays (id pays :31)Italy
Division (id division :88)Serie C1B
Pays (id pays :12)Mexico
Pays (id pays :44)Portugal
Pays (id pays :21)Russia
Pays (id pays :23)Slovakia
Pays (id pays :46)Turkey

Sport (sport id :2) : Basketball
Pays (id pays :15)USA

Sport (sport id :4) : Ice Hockey
Pays (id pays :40)Finland
Division (id division :126)Mestis
Pays (id pays :38)Norway
Pays (id pays :98)Slovakia
Pays (id pays :39)Sweden
Pays (id pays :54)Switzerland
Division (id division :2976)NLA Playout
Pays (id pays :37)USA

Sport (sport id :5) : Tennis
Pays (id pays :6)WTA

Sport (sport id :6) : Handball

Sport (sport id :7) : Floorball

Le script n'affiche pas le nom des pays pour le handball et le floorball... il n'affiche pas non plus toutes les divisions pour chaque pays...

Je ne comprends pas/plus... pourquoi ca ne fonctionne pas !
Je pense avoir tout fait comme il le fallait... foreach dans foreach dans foreach :p

Sam53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h56.


 
 
 
 
Partenaires

Hébergement Web