[Résolu][PHP ET XML] Récupération de données

Diablanc
Invité n'ayant pas de compte PHPfrance

20 févr. 2012, 21:40

Bonsoir,

Le problème :
J'arrive à récupérer les données du XML (ICI : http://fr.wowhead.com/item=54443&xml) jusqu'à la "spell" avec ce code :

Code : Tout sélectionner

$craft = new SimpleXMLElement($itemURLPrefix . $itemID. '&xml', NULL, TRUE); foreach ($craft->item->createdBy->spell as $recipe) { $recipeAttrs = $recipe->attributes(); $recipeID = $recipeAttrs['id']; $recipeNAME = $recipeAttrs['name']; $recipeICON = $recipeAttrs['icon']; }
Mais je ne comprend pas ou est cette ligne dans l'arborescence du XML .... :

Code : Tout sélectionner

<reagent id="53643" name="Rouleau d'étoffe de braise-soie" quality="1" icon="inv_misc_emberweavecloth_01" count="15"/>

Si vous pouviez me renseigner car malgrès mes recherches je n'ais rien trouvé.

Merci

ViPHP
xTG
ViPHP | 7331 Messages

20 févr. 2012, 21:49

var_dump($craft->item->createdBy->spell->reagent[0]);
;)

diablanc
Invité n'ayant pas de compte PHPfrance

20 févr. 2012, 22:07

Merci, je teste ca et me renseigne sur "var_dump" ^^ =D>

diablanc
Invité n'ayant pas de compte PHPfrance

20 févr. 2012, 23:13

Bon, ca m'affiche bien :

Code : Tout sélectionner

object(SimpleXMLElement)[4] public '@attributes' => array 'id' => string '53643' (length=5) 'name' => string 'Rouleau d'étoffe de braise-soie' (length=32) 'quality' => string '1' (length=1) 'icon' => string 'inv_misc_emberweavecloth_01' (length=27) 'count' => string '15' (length=2)
Mais j'ai chercher sur http://fr.php.net/manual/fr/function.var-dump.php mais je ne trouve pas le moyen de passer :

Code : Tout sélectionner

'id' => string '53643' (length=5) 'name' => string 'Rouleau d'étoffe de braise-soie' (length=32) 'icon' => string 'inv_misc_emberweavecloth_01' (length=27)
en variable ($reagentID, $reagentNAME, $reagentICON )

Je suis désolé :oops: mais j'apprend à coder et la ^^ je trouve pas.

merci

ViPHP
xTG
ViPHP | 7331 Messages

20 févr. 2012, 23:19

Le var_dump t'indique la structure de la variable.
En l’occurrence là c'est un objet.
Donc après c'est grâce aux fonction de SimpleXMLElement :
$item = $craft->item->createdBy->spell->reagent[0];
$attrs = $item->attributes();
$reagentID = $attrs['id'];
//etc

Diablanc
Invité n'ayant pas de compte PHPfrance

20 févr. 2012, 23:28

Merci beaucoup, =D>
je me mélange encore les pinceaux avec les "notions" mais je m'accroche .

Diablanc
Invité n'ayant pas de compte PHPfrance

21 févr. 2012, 00:53

Vraiment désolé mais j'ai encore un question, j'ai beau chercher mais je pense que je manque de vocabulaire. :cry:
$recipe0 = $craft->item->createdBy->spell->reagent[  ICI --->0 ];
On vas commencer par la :

- le "0" entre [] porte'il un nom spécifique ? ( pour m'aider à m'éduquer)

- Ensuite si j'ai plusieurs "reagent" ( ce qui est mon cas bien sur ...), comment puis je l'indiquer dans les [] ?

Si je les laisse vide ... erreur, idem avec une jolie *, j'ai essayer aussi ' ' ... mais erreur à chaque essaie.

Si vous pouviez me donner une adresse qui traite de façon complète de la récupération de donnée dans un XML je suis également preneur,ça m'éviteras de vous harceler toute les heures :oops: .

Merci encore de votre patience

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 févr. 2012, 07:52

Salut,

Il te manque la notion de tableau.
Les tableaux se reconnaissent aux crochets en fin de variable (par exemple $tablo[]).
Un tableau c'est une "pile" de valeurs.

Chaque ligne du tableau est référencée par un index (le mot que tu cherche).
Par défaut cet index est numérique et commence à zéro (info et plus généralement en électronique un "comptage" commence toujours à zéro). Avec php cet index peux aussi être une chaîne de caractère et tu peux mélanger les deux dans un même tableau.
Exemple
$tablo[0]
$tablo['ma donnée qui va bien']

Dans ton cas si tu a plusieurs infos à récupèrer je te conseil d'utiliser foreach pour le parcourir, tu n'aura pas à te soucier des limites la fonction le fera pour toi ;)

Pour l'utilisation de XML avec php je crois qu'il y a quelque chose la dessus dans la partie tuto.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 12 Messages

21 févr. 2012, 11:14

Dans ton cas si tu a plusieurs infos à récupèrer je te conseil d'utiliser foreach pour le parcourir, tu n'aura pas à te soucier des limites la fonction le fera pour toi ;)
J'ai utilisé foreach pour récupérer les données dans un tableau ( premier post ) mais je connaissais pas la syntaxe avec les [].

Mon soucis c'est que dans le XML il vas y avoir plusieurs tableaux du même nom :

Code : Tout sélectionner

<reagent id="37663" name="Barre d'acier-titan" quality="2" icon="INV_Ingot_Titansteel_blue" count="12"/> <reagent id="39681" name="Poignée de boulons en cobalt" quality="1" icon="INV_Misc_EngGizmos_29" count="40"/> <reagent id="44128" name="Fourrure arctique" quality="3" icon="INV_Misc_Pelt_14" count="2"/> <reagent id="44499" name="Pièces de golem de fer récupérées" quality="1" icon="INV_Misc_EngGizmos_19" count="1"/> <reagent id="44501" name="Piston façonné par les gobelins" quality="1" icon="INV_Rod_Platinum" count="8"/> <reagent id="44500" name="Pot d'échappement plaqué d'élémentium" quality="1" icon="INV_Gizmo_Pipe_02" count="1"/>
J'arrive parfaitement à récupérer les info de cette façon :

Code : Tout sélectionner

$recipe0 = $craft->item->createdBy->spell->reagent[0]; //[0] -> * ?? $recipeAttrs = $recipe0->attributes(); $reagentID = $recipeAttrs['id']; $reagentNAME = $recipeAttrs['name']; $reagentICON = $recipeAttrs['icon'];
En modifiant le 0 en 1 etc dans les [] je passe de l'un à l'autre.

Comme je vais utiliser différents XML où il vas y avoir un nombre différent de tableaux nommé "reagent" je souhaiter pouvoir récupérer les tableaux en bouclant . Mon soucis c'est que je ne sais pas quelle valeur placer entre les [] pour indiquer une variable. ( Que ça passe du tableau 0 au 1 au 2 etc....)
Pour l'utilisation de XML avec php je crois qu'il y a quelque chose la dessus dans la partie tuto.
Merci pour l'info je vais chercher ça.

Merci du temps passé à me répondre. =D>

ViPHP
xTG
ViPHP | 7331 Messages

21 févr. 2012, 11:28

Tu n'as pas à connaitre le nombre comme te l'a dit moogli.
foreach est là pour ça !
$monTableau = array(1,2,3,4,5,6,7,8,9);
foreach($monTableau as $valeur){
  echo $valeur . ', ';
}

Eléphanteau du PHP | 12 Messages

21 févr. 2012, 14:41

Je suis désolé mais je reviens encore vers vous car ce n'est pas un simple Array .Dans le style de votre exemple :
$monTableau = array(1,2,3,4,5,6,7,8,9);
foreach($monTableau as $valeur){
  echo $valeur . ', ';
}
mais plus un Array à l'intérieur d'un autre dans ce style :
$monTableau =array(array[0](1,2,3,4,5,6,7,8,9),array[1](1,2,3,4,5,6,7,8,9),array[2](1,2,3,4,5,6,7,8,9)) ;// la quantité peut varier
foreach($monTableau as $valeur){ // la je n'arrive pas recupérer toutes les données
  echo $valeur . ', ';
}
Voila le code que j'utilise :
foreach ($craft->item->createdBy->spell->reagent AS $reagent)
				{ 
				$reagentAttrs = $reagent->attributes();
					$reagentID = $reagentAttrs['id'];
					$reagentNAME = $reagentAttrs['name'];
					$reagentCOUNT = $reagentAttrs['count'];
				}
			
			$SQL2="INSERT INTO recipes_reagents (RecipeID, CompoWowID, Nom, Number) 
			VALUES (".$recipeID.','.$reagentID.','.
			"'".$conn->real_escape_string($reagentNAME)."',".
			$reagentCOUNT.")".
			"ON DUPLICATE KEY UPDATE CompoWowID=CompoWowID";
	echo "SQL2 :".$SQL2,"<br>";			
			$conn->query($SQL2);
Il fonctionne mais ne me récupère que le dernier "reagent" (array donc).
Pour rappel c'est avec cette page XML que je travaille.

Merci à vous

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 févr. 2012, 14:51

un simple foreach sur le "reagent" fournis par "$recipe"
foreach ($recipe->reagent as $reagent) {
          echo $reagent['name'].'<br />';
      }
ce qui au final peu donner
<?php
header('Content-Type: text/html; charset=utf-8');
$itemURLPrefix = 'http://fr.wowhead.com/item=';
$itemID = '54443';
$craft = new SimpleXMLElement($itemURLPrefix . $itemID. '&xml', NULL, TRUE);
foreach ($craft->item->createdBy->spell as $recipe)
   {
   $recipeAttrs = $recipe->attributes();
      $recipeID = $recipeAttrs['id'];
      $recipeNAME = $recipeAttrs['name'];
      $recipeICON = $recipeAttrs['icon'];
      echo $recipeNAME.' créer par : <br /><fieldset>';
      foreach ($recipe->reagent as $reagent) {
          echo $reagent['name'].'<br />';
      }
      echo '</fieldset>';
   }   
?>
Sac en braise-soie créer par :
Rouleau d'étoffe de braise-soie
Poussière hypnotique
ou en prenant un item plus drôle
<?php
header('Content-Type: text/html; charset=utf-8');
$itemURLPrefix = 'http://fr.wowhead.com/item=';
$itemID = '23836';
$craft = new SimpleXMLElement($itemURLPrefix . $itemID. '&xml', NULL, TRUE);
foreach ($craft->item->createdBy->spell as $recipe)
   {
   $recipeAttrs = $recipe->attributes();
      $recipeID = $recipeAttrs['id'];
      $recipeNAME = $recipeAttrs['name'];
      $recipeICON = $recipeAttrs['icon'];
      echo $recipeNAME.' créer par : <br /><fieldset>';
      foreach ($recipe->reagent as $reagent) {
          echo $reagent['name'].'<br />';
      }
      echo '</fieldset>';
   }   
?>
Lance-roquettes gobelin créer par :
Tube en adamantite trempé
Batterie en khorium
Stabilisateur en gangracier
Feu primordial
Terre primordiale
Convertisseur d'arcanite délicat
:mrgreen: :mrgreen:

tiens un exemple http://phpjungle.info/phpfrance/wowhead.php tu peux même changer d'item (et un peu navigation dans les items) et voir le source.

ça reste simpliste mais tu peux y voir ce que tu souhaite (oui je suis en design :) )

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 12 Messages

21 févr. 2012, 15:23

:oops: S'applatis lamentablement devant son IGNORANCE et sa BETISE sans bornes. :oops:
J'ai trouvé mon erreur
JE VOUS LA MONTRE ICI :
<?php
foreach ($craft->item->createdBy->spell->reagent AS $reagent)
                                { 
                                $reagentAttrs = $reagent->attributes();
                                        $reagentID = $reagentAttrs['id'];
                                        $reagentNAME = $reagentAttrs['name'];
                                        $reagentCOUNT = $reagentAttrs['count'];
                                } //<-----------ICI ------------ je ferme le foreach comme une buse
                        
                        $SQL2="INSERT INTO recipes_reagents (RecipeID, CompoWowID, Nom, Number) 
                        VALUES (".$recipeID.','.$reagentID.','.
                        "'".$conn->real_escape_string($reagentNAME)."',".
                        $reagentCOUNT.")".
                        "ON DUPLICATE KEY UPDATE CompoWowID=CompoWowID";
        echo "SQL2 :".$SQL2,"<br>";     
?>     
Vraiment désolé pour le temps que je vous ais fait perdre...... Je me sent LA MEN TA BLE ....... :oops:


Encore merci pour votre aide =D>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 févr. 2012, 17:38

:mrgreen: :mrgreen: :mrgreen:

ça arrive à tous le monde :)

bon courage

@+
Il en faut peu pour être heureux ......