Bonsoir, Je m'explique j'ai un fichier xml qui contient plusieurs fois la balise price (prix d'un produit, prix des taxes et prix des frais de ports).

Lorsque je parse mon flux, je récupére bien pour mon premier noeud le prix du produit mais pour chaque produit ensuite il me donne le prix des taxes et pour le produit suivant le prix des frais de ports et recommence avec le bon prix, etc .... En fait, il y a un décalage de 3 noeuds que j'ai indiqué en gras dans le fichier xml

Le fichier xml est le suivant :


<product>
+<product_id>
<manufacturer>[Reference produit du fabricant]</manufacturer>
</product_id>
<title>[Nom du produit]</title>
<desc>[Description du produit]</desc>
<full_desc>[Description élargie du produit]</full_desc>
+<url>[Lien de redirection tracké Public-Idées du produit]</url>
<other>[Informations complémentaires sur le produit]</other>

+<price currency="euro">[Prix du produit]</price>+

<tax>
<name>[Nom de la taxe associée au produit]</name>
<price currency="euro">[Montant de la taxe associée au produit]</price>
</tax>

+<shipping>
<delivery>[Texte associé aux frais de port du produit]</delivery>
<price currency="euro">[Montant des frais de port du produit]</price>
</shipping>
</product>


Mon code pour récupérer la valeur price est le suivant :
$photos = new DOMDocument;
$photos->load('flux.xml');
for($i=0;$i<50;$i++)

{
    
		$numeroPhoto = $i;
  echo $photos->getElementsByTagName('price')->item($numeroPhoto)->firstChild->data;
}


Ceci m'affiche :
produit 1 -> le bon prix
produit 2 -> le prix de tax
produit 3 -> le prix de shipping
produit 4 -> le bon prix
etc ......

En fait je veux juste affiche : <price currency="euro">[Prix du produit]</price> qui est enfant de product mais je n'y arrive pas
Smiley confused

Si quelqu'un peut m'éclairer. ?

Merci
Modifié par doomer (18 Dec 2007 - 10:57)
Si je mets :

  echo $photos->getElementsByTagName('price')->item(0)->firstChild->data;


Cela m'affiche le même prix partout

si je mets :
  echo $photos->getElementsByTagName('price')->item($numeroPhoto+3)->firstChild->data;


Cela ne fait que de decaler les prix mais pas de me donner le prix exact par produit.

Difficile à expliquer comme cela.
Salut,

Je pense avoir compris ton problème seulement je ne comprends pas tout à fait ton xml.

Pourrais tu poster ton fichier xml en globalité et prendre un exemple où il y a plusieurs produits. Je pourrais mieux cerner ton problème.
bapfuror a écrit :
Salut,

Je pense avoir compris ton problème seulement je ne comprends pas tout à fait ton xml.

Pourrais tu poster ton fichier xml en globalité et prendre un exemple où il y a plusieurs produits. Je pourrais mieux cerner ton problème.


Voici un exemple de fichier XML :


<catalogue id="[Identifiant du programme]">
<progname>[Nom du programme]</progname>
<store>
<name>[Nom du marchand]</name>
<products>
	<product>
	<product_id>
<ean>["European Article Numbering" du produit]</ean>
<store>[Reference produit du marchand]</store>
<manufacturer>[Reference produit du fabricant]</manufacturer>
</product_id>
<trademark>[Marque du produit]</trademark>
<title>[Nom du produit]</title>
<desc>[Description du produit]</desc>
<full_desc>[Description élargie du produit]</full_desc>
<url>[Lien du produit]</url>
<other>[Informations complémentaires sur le produit]</other>
<product_images>
<image type="default">[Lien vers l'image par défaut du produit]</image>
<image type="small">[Lien vers l'image de petite taille du produit]</image>
<image type="medium">[Lien vers l'image de taille moyenne roduit]</image>
<image type="large">[Lien vers l'image de grande taille du produit]</image>
</product_images>
<price currency="[Unité monétaire utilisée du prix du produit]">[Prix du produit]</price>

<tax>
<name>[Nom de la taxe associée au produit]</name>
<price currency="[Unité monétaire de la taxe du produit]">[Montant de la taxe associée au produit]</price>
</tax>

<shipping>
<delivery>[Texte associé aux frais de port du produit]</delivery>
<price currency="[Unité monétaire des frais de port]">[Montant des frais de port du produit]</price>
</shipping>

<category>
<merchant>
<name>[Catégorie du marchand associée au produit]</name>
<id>
[Identifiant de la catégorie du marchand associée au produit]
</id>
</merchant>
</category>
</product>
</products>
</store>
</catalogue>




<?xml version="1.0" encoding="UTF-8" ?> 
- <catalogue id="523">
  <progname>Test de catalogue</progname> 
- <store>
  <name>Catalogue</name> 
- <products>
- <product>
- <product_id>
  <ean /> 
  <store>963932</store> 
  <manufacturer /> 
  </product_id>
  <trademark /> 
  <title>Collier</title> 
  <desc>Ras du cou </desc> 
  <full_desc /> 
- <url>
- <![CDATA[  http://www.site.com
 
  ]]> 
  </url>
  <other /> 
- <product_images>
  <image type="default">http://www.site.com/image.jpg</image> 
  <image type="small" /> 
  <image type="medium" /> 
  <image type="large" /> 
  </product_images>
  <price currency="EUR">855</price> 
- <tax>
  <name /> 
  <price currency="EUR" /> 
  </tax>
- <shipping>
  <delivery>port gratuit pour les achats dès EUR 75.00</delivery> 
  <price currency="EUR">5.95</price> 
  </shipping>
- <category>
- <merchant>
  <name>Collection Fashion</name> 
  <id /> 
  </merchant>
  </category>
  </product>
- <product>
- <product_id>
  <ean /> 
  <store>963931</store> 
  <manufacturer /> 
  </product_id>
  <trademark /> 
  <title>Ace</title> 
  <desc>Grand coeur chaîne en argent</desc> 
  <full_desc /> 
- <url>
- <![CDATA[  http://www.site.com
 
  ]]> 
  </url>
  <other /> 
- <product_images>
  <image type="default">http://www.site.com/image.jpg</image> 
  <image type="small" /> 
  <image type="medium" /> 
  <image type="large" /> 
  </product_images>
  <price currency="EUR">1150</price> 
- <tax>
  <name /> 
  <price currency="EUR" /> 
  </tax>
- <shipping>
  <delivery>port gratuit pour les achats dès EUR 75.00</delivery> 
  <price currency="EUR">5.95</price> 
  </shipping>
- <category>
- <merchant>
  <name>Collection Fashion</name> 
  <id /> 
  </merchant>
  </category>
  </product>
- <product>
- <product_id>
  <ean /> 
  <store>963930</store> 
  <manufacturer /> 
  </product_id>
  <trademark /> 
  <title>Ace of </title> 
  <desc>Grand coeur </desc> 
  <full_desc /> 
- <url>
- <![CDATA[  http://www.site.com
 
  ]]> 
  </url>
  <other /> 
- <product_images>
  <image type="default">http://www.site.com/image.jpg</image> 
  <image type="small" /> 
  <image type="medium" /> 
  <image type="large" /> 
  </product_images>
  <price currency="EUR">1150</price> 
- <tax>
  <name /> 
  <price currency="EUR" /> 
  </tax>
- <shipping>
  <delivery>port gratuit pour les achats dès EUR 75.00</delivery> 
  <price currency="EUR">5.95</price> 
  </shipping>
- <category>
- <merchant>
  <name>Collection couture</name> 
  <id /> 
  </merchant>
  </category>
  </product>
- <product>
- <product_id>
  <ean /> 
  <store>963929</store> 
  <manufacturer /> 
  </product_id>
  <trademark /> 
  <title>Downtown</title> 
  <desc>Bracelet en cuir.</desc> 
  <full_desc /> 
- <url>
- <![CDATA[  http://www.site.com
 
  ]]> 
  </url>
  <other /> 
- <product_images>
  <image type="default">http://www.site.com/image.jpg</image> 
  <image type="small" /> 
  <image type="medium" /> 
  <image type="large" /> 
  </product_images>
  <price currency="EUR">265</price> 
- <tax>
  <name /> 
  <price currency="EUR" /> 
  </tax>
- <shipping>
  <delivery>port gratuit pour les achats dès EUR 75.00</delivery> 
  <price currency="EUR">5.95</price> 
  </shipping>
- <category>
- <merchant>
  <name>Collection Fashion</name> 
  <id /> 
  </merchant>
  </category>
  </product>
</products>
</store>
</catalogue>



En espérant que ton aide m'aide à résoudre ce soucis Smiley cligne Smiley cligne
Salut,

Voila je me suis penché sur ton problème ce matin et après une vingtaine minutes, j'ai trouvé la solution. J'ai effectué les tests sur le xml que tu as posté donc le code devrait marcher pour toi aussi.


<?php
$dom = new DomDocument();
$dom->load('test.xml');
$listeProduct = $dom->getElementsByTagName('product');
foreach($listeProduct as $product){
	$price = $product->getElementsByTagName('price')->item(0);
	echo $price->nodeValue."<br />";
}
?>


Voila j'espère que ça fonctionne de ton côté aussi !


EDIT >> J'ai trouvé une autre solution qui est surement plus générique.


<?php
$dom = new DomDocument();
$dom->load('test.xml');
$listeProduct = $dom->getElementsByTagName('product');
foreach($listeProduct as $product){
	$listePrice = $product->getElementsByTagName('price');
	foreach($listePrice as $price){
		if($price->parentNode->localName=="product")
		echo $price->nodeValue."<br />";
	}
}
?>



Pour l'explication :
- 1 méthode : avantage simple d'utilisation
inconvénient la place des balises ne peut en aucun cas être modifié.
- 2 méthode : celle que je préfère Smiley ravi
avantage la place des balises n'est pas strict
inconvénient un peu plus compliqué que la 1ère

lien util : lien
Modifié par bapfuror (19 Dec 2007 - 14:41)
Hello merci de ta réponse et de ton aide, le probléme c'est que cela m'affiche tous les prix des produit pour chaque entite produit. Par exemple si mon catalogue fait 10 produits, au moment où j'affiche le 1er produit, je vais avoir les 10 prix des produits et pour le deuxieme je vais avoir les 10 prix, etc...

En fait je veux pour chauqe produit afficher le nom et le prix. Mais là ce n'est pas le cas Smiley confus si tu vois ce queje veux dire.
ok j'avais pas compris comme ça. Bon en tout cas comme y a une solution a tout problème ....


$dom = new DomDocument();
$dom->load('exemple.xml');
$product = $dom->getElementsByTagName('product')->item(0);
$title = $product->getElementsByTagName('title')->item(0);
$title = $title->nodeValue;
$listePrice = $product->getElementsByTagName('price');
foreach($listePrice as $price){
	if($price->parentNode->localName=="product")
		echo $title." : ".$price->nodeValue."<br />";
}


Voila si tu veux le 1er produit de l'arbre xml.

donc si tu veux le 2ème tu remplace la 3ème ligne par :
$product = $dom->getElementsByTagName('product')->item(1);

pour le 3ème produit par :
$product = $dom->getElementsByTagName('product')->item(2);

etc ... ....
Après si tu veux automatiser ce code tu n'auras qu'à ajouter une boucle permettant d'increment le chiffre en parametre dans le item(compteur) de la 3ème ligne.


Voila j'espère que cette fois ci j'ai bien cerné le problème
Smiley langue
C'est ce que j'ai fais avec une boucle mais rien y fait regarde ta boite privé sur alsacreations je t'ai envoyé un message.

Smiley cligne
Salut,
doomer a écrit :
C'est ce que j'ai fais avec une boucle mais rien y fait regarde ta boite privé sur alsacreations je t'ai envoyé un message.

Le but du forum est de mutualiser des connaissances pour l'ensemble de la communauté. Merci donc de poursuivre la discussion dans le sujet et non par MPs. Smiley smile
Je te remercie j'ai réussi j'ai fais ceci :

 
Une boucle plus ceci : 
$product = $photos->getElementsByTagName('product')->item($numeroPhoto);

$listePrice = $product->getElementsByTagName('price');

foreach($listePrice as $price){

	if($price->parentNode->localName=="product")

		echo $price->nodeValue."<br />";
}


Merci encore à toi.
Modifié par doomer (26 Dec 2007 - 21:38)