Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > SimpleXML
SimpleXML Forum d'entraide pour l'extension SimpleXML, qui permet de manipuler des documents XML en PHP (approche DOM).
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 28/04/2007, 09h36   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 109
Points : 11
Points : 11
Par défaut [SimpleXML] requête sur un fichier xml

bonjour,
je suis en train de parsser un xml avec simplexml de la forme:

Code XML :
1
2
3
4
5
6
7
8
9
<root>
 <voiture>
  <marque>vw</marque>
  <carburation>diesel</carburation>
  <couleur>rouge</couleur>
  <etat>neuf</etat>
 </voiture>
......
</root>

le hic est que le fichier xml est trop volumineux,et je veut l'afficher en html avec une pagination de 10 noeud par page tout en introduisant certain caractere qui sont passer en parametre : par exemple je veu afficher les voitures de couleur rouge.
j essayer cela:

Code :
1
2
3
4
5
6
7
8
9
    $document = simplexml_load_file('monxml.xml');
    $produits = $document->xpath(utf8_encode("//voiture[couleur='rouge']"));
 
  foreach ($produits as $produit) {
						echo utf8_decode((string)$produit->marque);
						echo utf8_decode((string)$produit->carburation);	
						echo utf8_decode((string)$produit->etat);
 
				}
mais cette boucle m'affiche tous les articles (dans le meme page) avec le critere choisi sans pagination. Comment doit je proceder?
ANISSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2007, 10h55   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Pour la pagination soit vous ajoutez des tests supplémentaires dans votre expression XPath sur la position (fonction position(), voir ce sujet) ou alors vous ajoutez des tests dans la boucle de sorte à sauter les N premières voitures puis à parcourir les X voitures qui vous intéressent et enfin vous arrêtez la boucle (mot clé break : inutile de parcourir le reste).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2007, 12h25   #3
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 109
Points : 11
Points : 11
j essayer cette expression de xpath:
$article->xpath("//voiture[position()>=5 and position()<15 and //voiture[couleur='rouge']")
mai ca rien donner!!!
ANISSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2007, 13h26   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Votre expression XPath n'est pas correcte :
Code X :
//voiture[couleur='rouge' and position()>=5 and position()<15]
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2007, 10h56   #5
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 109
Points : 11
Points : 11
j'ai modifié mon xml sous cette structure:

Code XML :
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
  <produit>
    <nom_fournisseur>nom du fournisseur</nom_fournisseur>
    <nom_produit>nom du produit</nom_produit>
    <id_produit>id produit</id_produit>
    <accroche>description du produit</accroche>
    <theme_produit>theme du produit</theme_produit>
    <url_produit>url de produit</url_produit>
    <img_produit>url d'image de produit</img_produit>
    <pays_dest>pays destination</pays_dest>
    <ville_dest>ville destination</ville_dest>
    <jours>noimbre de jours</jours>
    <nuits>nombre de nuits</nuits>
    <repas>le repas</repas>
    <prix>
      <unprix>
        <ville_dep>paris</ville_dep>
        <date_dep>date depart</date_dep>
        <prix_produit>prix</prix_produit>
      </unprix>
      <unprix>
        <ville_dep>lyon</ville_dep>
        <date_dep>date de depart 2</date_dep>
        <prix_produit>prix2</prix_produit>
      </unprix>
 
    </prix>
  </produit>
   .....
je veu afficher tous les produits qui ont comme ville de depart paris par exemple, tout en gardant une pagination de 10 produits par page?

comment faire?
j 'essayer ca :

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
define('NB_PAR_PAGE', 10); 
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;   
$document = simplexml_load_file('monxml.xml'); 
$count = count($document->xpath("//produit/prix/unprix/ville_dep='paris'")); 
 
$debut_pos = ($page - 1) * NB_PAR_PAGE; 
$fin_pos = $page * NB_PAR_PAGE; $derniere_page = ceil($count / NB_PAR_PAGE);
 
$produits= $document->xpath(utf8_encode("//produit[position()>=$debut_pos and position()<$fin_pos]/prix/unprix/ville_dep='paris'"));
 
	if ($produits && count($produits) > 0) {
         foreach ($produits as $produit) {
$nomp=utf8_decode((string)$produit->nom_produit);
$pays=utf8_decode((string)$produit->pays_dest);					$ville=utf8_decode((string)$produit->ville_dest);
$dep=utf8_decode((string)$produit->prix->unprix->date_dep);
$desc=utf8_decode((string)$produit->accroche);
$img=utf8_decode((string)$produit->img_produit);
$pri=utf8_decode((string)$produit->prix->unprix->prix);
$url=utf8_decode((string)$produit->url_produit);
 
 
echo '<table width="90%" border="0" align="center">
					   <tr> 
                        <td rowspan="4" width="100"><img src="'.$img.'" width="90" height="70"></td>
    					<td width="500">'.$nomp.'   '.$pays.'('.$ville.')</td>
                        <td rowspan="4" align="center"><img src="'.$lien.'" border="0" width="80"></td>
                        <td rowspan="4">'.$pri.'</td>
   					    <td rowspan="4" width="70" align="right"><a href="'.$url.'"><img src="voir_offre.jpg" border="0"></a></td>
				       </tr>
				       <tr> 
                        <td width="500" align="left"><div align="justify">'.$desc.'</div></td>
				       </tr>
				       <tr> 
                        <td>depart : '.$dep.'</td>
				      </tr>
				</table>
				';
	      } 
echo '<table align="center">
		<tr>
		  <td>';
 
if ($page > 1) {  
                echo '<a href="' . basename(__FILE__) . '?page=' . ($page - 1) . '" class="bleudetails2"> << pr&eacute;c&eacute;dente </a>'; 
               } 
for ($i = 1; $i <= $derniere_page; $i++) {  
							if ($i == $page) {  echo '<a class="bleudetails2" >' . $i . '</a>'; } 
							else {  echo '<a href="' . basename(__FILE__) . '?page=' . $i . '" class="bleudetails2"> ' . $i . ' </a>'; 							     }  
								 }  if ($page < $derniere_page) {  echo '<a href="' . basename(__FILE__) . '?page=' . ($page + 1) . '" class="bleudetails2">  suivante >> </a>'; 
								                              } } 
echo'</td>
     </tr>
   </table>';
 
?>
ANISSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2007, 15h11   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Les expressions XPath n'étaient pas correctes (voilà votre code remis en forme ) :
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
define('NB_PAR_PAGE', 10); 
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;   
$document = simplexml_load_file('produits.xml'); 
$count = count($document->xpath("//produit[prix/unprix/ville_dep='paris']")); 
 
$debut_pos = ($page - 1) * NB_PAR_PAGE + 1; 
$fin_pos = $page * NB_PAR_PAGE + 1;
$derniere_page = ceil($count / NB_PAR_PAGE);
 
if ($count > 0) {
    $produits = $document->xpath(utf8_encode("//produit[position()>=$debut_pos and position()<$fin_pos and prix/unprix/ville_dep='paris']"));
    foreach ($produits as $produit) {
        $nomp = utf8_decode((string) $produit->nom_produit);
        $pays = utf8_decode((string) $produit->pays_dest);
        $ville = utf8_decode((string) $produit->ville_dest);
        $dep = utf8_decode((string) $produit->prix->unprix->date_dep);
        $desc = utf8_decode((string) $produit->accroche);
        $img = utf8_decode((string) $produit->img_produit);
        $pri = utf8_decode((string) $produit->prix->unprix->prix);
        $url = utf8_decode((string) $produit->url_produit);
        $lien = ''; // Variable indéfinie sans
 
        echo '<table width="90%" border="0" align="center">
            <tr> 
                <td rowspan="4" width="100"><img src="'.$img.'" width="90" height="70"></td>
                <td width="500">'.$nomp.'   '.$pays.'('.$ville.')</td>
                <td rowspan="4" align="center"><img src="'.$lien.'" border="0" width="80"></td>
                <td rowspan="4">'.$pri.'</td>
                <td rowspan="4" width="70" align="right"><a href="'.$url.'"><img src="voir_offre.jpg" border="0"></a></td>
            </tr>
            <tr> 
                <td width="500" align="left"><div align="justify">'.$desc.'</div></td>
            </tr>
            <tr> 
                <td>depart : '.$dep.'</td>
            </tr>
        </table>';
    }
    echo '<table align="center">
        <tr>
            <td>';
 
    if ($page > 1) {  
        echo '<a href="' . basename(__FILE__) . '?page=' . ($page - 1) . '" class="bleudetails2"> << pr&eacute;c&eacute;dente </a>'; 
    } 
    for ($i = 1; $i <= $derniere_page; $i++) {  
        if ($i == $page) {
            echo '<a class="bleudetails2" >' . $i . '</a>';
        } else {
            echo '<a href="' . basename(__FILE__) . '?page=' . $i . '" class="bleudetails2"> ' . $i . ' </a>';
        }  
    }
    if ($page < $derniere_page) {
        echo '<a href="' . basename(__FILE__) . '?page=' . ($page + 1) . '" class="bleudetails2">  suivante >> </a>'; 
    }
    echo '</td>
        </tr>
    </table>';
}
?>
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2007, 16h04   #7
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 109
Points : 11
Points : 11
merci beaucoup julp pour ton coup de main,ca marche a merveille
ANISSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2007, 17h29   #8
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 109
Points : 11
Points : 11
je revient a vous,
desolé je me suis emporté un peu,mais le code ci dessus presente des erreurs.
si je veux chercher la deuxieme ville (lyon) et non la premiere, le resultat sera vide!,comment faire afin de parcourir tous les noeuds "unprix" pour savoir c lyon existe ou pas
ANISSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2007, 18h25   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Si vous souhaitez parcourir toutes les balises <unprix> :
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
define('NB_PAR_PAGE', 10); 
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;   
$document = simplexml_load_file('produits.xml'); 
$count = count($document->xpath("//produit[prix/unprix/ville_dep='paris']")); 
 
$debut_pos = ($page - 1) * NB_PAR_PAGE + 1; 
$fin_pos = $page * NB_PAR_PAGE + 1;
$derniere_page = ceil($count / NB_PAR_PAGE);
 
if ($count > 0) {
    $produits = $document->xpath(utf8_encode("//produit[position()>=$debut_pos and position()<$fin_pos and prix/unprix/ville_dep='paris']"));
    foreach ($produits as $produit) {
        $nomp = utf8_decode((string) $produit->nom_produit);
        $pays = utf8_decode((string) $produit->pays_dest);
        $ville = utf8_decode((string) $produit->ville_dest);
        $desc = utf8_decode((string) $produit->accroche);
        $img = utf8_decode((string) $produit->img_produit);
        $url = utf8_decode((string) $produit->url_produit);
        $lien = ''; // Variable indéfinie sans
 
        echo '<table width="90%" border="0" align="center">
            <tr> 
                <td rowspan="4" width="100"><img src="'.$img.'" width="90" height="70"></td>
                <td width="500">'.$nomp.'   '.$pays.'('.$ville.')</td>
                <td rowspan="4" align="center"><img src="'.$lien.'" border="0" width="80"></td>
                <td rowspan="4" width="70" align="right"><a href="'.$url.'"><img src="voir_offre.jpg" border="0"></a></td>
            </tr>
            <tr> 
                <td width="500" align="left"><div align="justify">'.$desc.'</div></td>
            </tr>';
        foreach ($produit->prix->unprix as $unprix) {
            echo '<tr>
                <td>depart : ' . utf8_decode((string) $unprix->date_dep) . ' à ' . utf8_decode((string) $unprix->ville_dep) . '</td>
            </tr>';
        }
        echo '</table>';
    }
    echo '<table align="center">
        <tr>
            <td>';
 
    if ($page > 1) {  
        echo '<a href="' . basename(__FILE__) . '?page=' . ($page - 1) . '" class="bleudetails2"> << pr&eacute;c&eacute;dente </a>'; 
    } 
    for ($i = 1; $i <= $derniere_page; $i++) {  
        if ($i == $page) {
            echo '<a class="bleudetails2" >' . $i . '</a>';
        } else {
            echo '<a href="' . basename(__FILE__) . '?page=' . $i . '" class="bleudetails2"> ' . $i . ' </a>';
        }  
    }
    if ($page < $derniere_page) {
        echo '<a href="' . basename(__FILE__) . '?page=' . ($page + 1) . '" class="bleudetails2">  suivante >> </a>'; 
    }
    echo '</td>
        </tr>
    </table>';
}
?>
Si vous souhaitez accéder directement à la deuxième :
Code :
1
2
3
4
5
6
7
8
9
10
 
        $nomp = utf8_decode((string) $produit->nom_produit);
        $pays = utf8_decode((string) $produit->pays_dest);
        $ville = utf8_decode((string) $produit->ville_dest);
        $dep = utf8_decode((string) $produit->prix->unprix[1]->date_dep); // Modifié
        $desc = utf8_decode((string) $produit->accroche);
        $img = utf8_decode((string) $produit->img_produit);
        $pri = utf8_decode((string) $produit->prix->unprix[1]->prix); // Modifié
        $url = utf8_decode((string) $produit->url_produit);
        $lien = ''; // Variable indéfinie sans
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 10h22   #10
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 109
Points : 11
Points : 11
je rectifié un peu le tir.
je voudrais parcourir toutes les balises <unprix> afin de tester c la ville de depart (ville_dep) dans notre cas "paris" (ou autre) est existante afin d'afficher tous les details de produit, est non pas d'afficher d'aficher tous ces dates de depart.
ANISSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 12h01   #11
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par ANISSS
je voudrais parcourir toutes les balises <unprix> afin de tester c la ville de depart (ville_dep) dans notre cas "paris" (ou autre) est existante afin d'afficher tous les details de produit, est non pas d'afficher d'aficher tous ces dates de depart.
Si j'ai bien compris : ce travail est déjà effectué par l'expression XPath qui permet de ne récupérer que les noeuds produit ayant un fils ville_dep qui vaut 'paris'. Si après vous souhaitez récupérer les informations de unprix où ville_dep = 'Paris' vu qu'il peut y en avoir plusieurs :
Code :
1
2
3
4
5
6
7
8
foreach ($produit->prix->unprix as $unprix) {
    if ((string) $unprix->ville_dep == 'paris') {
        break;
    }
}
echo '<tr>
    <td>depart : ' . utf8_decode((string) $unprix->date_dep) . ' à ' . utf8_decode((string) $unprix->ville_dep) . '</td>
</tr>';
Que l'on peut aussi faire avec une expression XPath normalement.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 12h25   #12
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 109
Points : 11
Points : 11
c ca le probleme c que l'expression xpath ne me permet pa de boucler sur tous les balises <unprix> pour voir c ce produit contient mon ville de depart ou non, elle me permet de tester sur la premiere balise est ca sa cause un probleme, voici un exemple :
prenat ce bout de code
Code XML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
....
      <unprix>
        <ville_dep>lyon</ville_dep>
        <date_dep>2007-11-12</date_dep>
        <prix_produit>3621</prix_produit>
      </unprix>
      <unprix>
        <ville_dep>lyon</ville_dep>
        <date_dep>2007-10-15</date_dep>
        <prix_produit>3981</prix_produit>
      </unprix>
      <unprix>
        <ville_dep>marseille</ville_dep>
        <date_dep>2007-10-01</date_dep>
        <prix_produit>3981</prix_produit>
      </unprix>
      <unprix>
        <ville_dep>paris</ville_dep>
        <date_dep>2007-09-03</date_dep>
        <prix_produit>3521</prix_produit>
      </unprix>
.....
avec mon expression xpath ce produit ne sera pa afficher alors kil contient bien une ville de depart vaut "paris" mais elle se situe dans la troisieme balises.
donc il me faut une expression ki me permet de parcourir tous les balises de chaque produit afin de verifier c mon ville de depart existe bien(quelque soit son niveau).
ANISSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h04   #13
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
J'ai beau essayer et rééssayer j'en arrive toujours au même résultat. J'ai même écrit un programme en C pour tester l'expression et quelque soit la position de ville_dep valant paris, il est pris en compte. A moins que la structure de votre document ne corresponde pas à la mienne ou que paris soit écrit autrement (majuscules ou blancs).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h22   #14
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 109
Points : 11
Points : 11
tu as le meme resultat car paris existe bien dans tous (ou presque)l es produits
essai avec lyon par exmple.et tu va voir la difference
ANISSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h25   #15
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 109
Points : 11
Points : 11
et je t'assure que la structure de mon document c la meme montrée ci dessus, ainsi le nom de la ville exacte
ANISSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 17h54   #16
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 109
Points : 11
Points : 11
Ta raison julp cette expression « xpath(utf8_encode("//produit[position()>=$debut_pos and position()<$fin_pos and prix/unprix/ville_dep=paris']")) » est juste.
Mais elle engendre un autre problème ; supposant que je vais afficher tous les produits qui ont ville de depart « paris », tout en gardant l’affichage de 10 produits par page. Est que dans mon fichier xml les 9 premiers produits ont une ville de départ autre que paris ,tan disque que le reste des produits ont une ville de part paris, cette expression xpath va m’afficher 1 seule produit dans la première page, est le reste des pages va être afficher correctement (car tous ont une ville_dep=paris) or je veux afficher 10 par page qui ont comme critere de recherche ville_dep=paris.
ANISSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 18h35   #17
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
J'ai fait une erreur sur position() suite aux différentes modifications et mon échantillon XML étant très sommaire il ne m'a pas permis de m'en rendre compte lors de mes tests :
Code :
$produits = $document->xpath(utf8_encode("//produit[prix/unprix/ville_dep='lyon'][position()>=$debut_pos and position()<$fin_pos]"));
Me le confirmez-vous ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2007, 09h21   #18
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 109
Points : 11
Points : 11
je le te confirme cher julp, ton hypothèse es t vraie.
Merci beaucoup pour ton coup de main. Ça marche nickel comme j l’espérer.
ANISSS est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h47.


 
 
 
 
Partenaires

Hébergement Web