Page 1 sur 1

petit probleme de recuperation d'attribut avec simpleXML

Posté : 23 oct. 2008, 23:24
par durthu
bonjour,
je souhaiterai connaître la valeur d'un attribut dans un document xml ayant a peu près cette structure :

Code : Tout sélectionner

<quiz> <question type="multichoice"> <name><text>posologie</text> </name> <questiontext format="html"> <text>quelle est la posologie du paracétamol ?</text> </questiontext> <answer fraction="0"> <text> 90 mg/kg/j répartie en 6 prises </text> </answer> <answer fraction="100"> <text> 60 mg/kg/j répartie en 4 prises </text> </answer> <answer fraction="0"> <text> 30 mg/kg/j répartie en 4 prises </text> </answer> </question> </quiz>
je voudrais connaître le numéro de la réponse ayant l'attribut fraction supérieur à 0.
donc pour $xml->question->answer[$a]['fraction'] je voudrais connaitre la valeur de $a lorsque fraction > 0.
J'ai essayé ce code :

Code : Tout sélectionner

//je compte d'abord le nombre de réponse $nbreponse = count($xml->question->answer); for ($a=0, $a<=$nbreponse, $a ++) { if ($xml->question->answer[$a]['fraction'] > 0) { echo $a;} }
mais ca me donne toujours la valeur 0...
merci d'avance

Posté : 23 oct. 2008, 23:42
par damaskinos
Salut ça fait un bout j'ai utilisé simpleXML mais je te donne un exemple. pour une structure ressemblant à ca :

Code : Tout sélectionner

<presses> <presse url="chenim fichier" desc="blabla" /> <presse url="chenim fichier" desc="blabla" /> </presses>

si tu veux acceder au premier attributs de presses qui est url tu fais
$xml = simplexml_load_file(' ton xml');
$xml->presse[0]->attributes()->url; 

//pour desc tu fais 
$xml->presse[0]->attributes()->desc;

Voilà à toi de l'adapter
Bon courage

Posté : 23 oct. 2008, 23:44
par damaskinos
Salut ça fait un bout j'ai utilisé simpleXML mais je te donne un exemple. pour une structure ressemblant à ca :

Code : Tout sélectionner

<presses> <presse url="chenim fichier" desc="blabla" /> <presse url="chenim fichier" desc="blabla" /> </presses>

si tu veux acceder au premier attributs de presse sans s qui est url tu fais
$xml = simplexml_load_file(' ton xml');
$xml->presse[0]->attributes()->url; 

//pour desc tu fais 
$xml->presse[0]->attributes()->desc;

Voilà à toi de l'adapter
Bon courage

Posté : 23 oct. 2008, 23:45
par durthu
merci pour cette réponse si rapide !!
donc cette "fonction" attributes()" permet de connaitre la valeur d'un attribut, je tente d'integrer ca dans mon code.
Merci beaucoup


EDIT :
je me suis mal exprimé...
je vais t'expliquer à quoi sert mon script. Je récupère un fichier xml, j'extrais des données et j'en recrée un autre avec les données extraites qui va etre utilisé par un logiciel (scenari)
en gros, ce sont des questions et des réponses. Lorsqu'une reponse est bonne l'attribut fraction est > à 0. Je veux connaitre le numero de la bonne réponse $a afin d'insérer dans mon nouveau document xml "la bonne réponse est la $aième réponse".

Parce que la le code que tu m'as donné va juste me permettre de savoir quelle est la valeur de 'fraction'.

j'ai l'impression que je devrais utiliser une boucle foreach mais j'ai du mal à mettre en pratique

Posté : 24 oct. 2008, 19:52
par damaskinos
Salut pour parcourir ton xml c'est simple tu utilises un for ou un foreach si tu veux. Disons on utilise un for

 $xml = simplexml_load_file(' ton xml');
 for($i=0;$i<count($xml->presse);$i++){
     $xml->presse[$i]->attributes()->url; 
     //pour desc tu fais 
     $xml->presse[$i]->attributes()->desc;
  }
Avec un foreach
$xml   = new SimpleXMLElement($xml);

 foreach($xml->children() as $rec){
    foreach($rec->attributes() as $att=>$attVal){
	echo $att." ".$attVal;
    }
}

Bon comme ca tu parcours ton XML. Avec des if tu peux effectuer tes tests, une fois tu trouves ce que tu veux, tu crees ton nouveau XML avec. Regarde du cote de la fonction addChild de simpleXML. addChild. J'ai pas trop compris cette phrase
Je veux connaitre le numero de la bonne réponse $a afin d'insérer dans mon nouveau document xml "la bonne réponse est la $aième réponse".
alors si tu y arrives pas clarifie moi ca et je pourrais t'aider un peu plus.
Bon courage

Posté : 24 oct. 2008, 23:14
par durthu
merci, ta premiere explication m'a bien aidé !!!
j'ai réussi à récupérer ce que je voulais en enchainant deux boucles for suivies d'un test par if :D

Posté : 26 oct. 2008, 12:26
par albat
Modération :
durthu, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.


Merci à damaskinos ;)