[PHP] - traitement d'un fichier XML [marche presque] cry

cry [PHP] - traitement d'un fichier XML [marche presque] - PHP - Programmation

Marsh Posté le 05-08-2003 à 14:08:22    

Voilà, j'explique :
 
Je cherche a faire un listing des membres d'un Outfit ( clan de PlanetSide, la team HFR ), et ceci a l'aide des fonction de lecture de fichier du PHP.
Le fichier a lire est un fichier XML, et en fait, je ne veux pas utiliser de parser, juste rechercher quelques infos dans ce fichier.
 
J'arrive dejà a recuperer ( dans un aute XML ) les informations de chaque joueurs, mais le probleme avec la team, c'est que le fichier XML contient plusieur fois le meme champ <charid>xxxxx</charid>.
 
pour les stats d'un joueur, les champs sont unique, donc je fait ca :
 

Code :
  1. $fp = fopen("http://stats.planetsidegaming.com/21/".$num."/stats2.xml","r" ); //lecture du fichier
  2. while (!feof($fp)) { //on parcoure toutes les lignes
  3.   $page .= fgets($fp, 4096); // lecture du contenu de la ligne
  4. }
  5. $num1 = eregi("<charid>(.*)</charid>",$page,$num); //on isole le nom
  6. ainsi de suite pour les autres champs ...


 
je voudrais donc trouver un moyen de parcourir le fichier XML ( http://stats.planetsidegaming.com/ [...] /stats.xml ) et recuperer tout les contenus des champs <charid>xxxx</charid> dans un tableau afin de faire un listing ...
 
merci bien d'avance ...
 
@+
 
ps: mon code n'es pas tres propre, mais ca marche, merci de ne pas m'en tenir trop rigueur


Message édité par bl@p_psx le 05-08-2003 à 17:10:02
Reply

Marsh Posté le 05-08-2003 à 14:08:22   

Reply

Marsh Posté le 05-08-2003 à 14:16:06    

en fait, si je trouve le moyen de parser l'XML pour ne sortir que les <charid> et les <name>, ca serais pas mal aussi ... le probleme, c'est que je n'ai aucune motion d'XML, et que je suis pas douer en traitement de chaine ( les seules chose que je faisais en php jusque là etait de l'insertion BD et lecture BD ..., rien de bien mechant )
 
@+

Reply

Marsh Posté le 05-08-2003 à 14:23:32    

t'as des fonctions toutes faites:
http://dev.nexen.net/docs/php/anno [...] p?lien=xml
 
mais si tu veux vraiment t'amuser je te conseillerais d'essayer avec domxml_xmltree()... c'est ... instructif :)

Reply

Marsh Posté le 05-08-2003 à 14:29:55    

Anapajari a écrit :

t'as des fonctions toutes faites:
http://dev.nexen.net/docs/php/anno [...] p?lien=xml
 
mais si tu veux vraiment t'amuser je te conseillerais d'essayer avec domxml_xmltree()... c'est ... instructif :)


 
ca a l'air pas mal du tout ( surtout la fin ) mais je n'y comprend pas grand chose ...
je fait quelques tests en me basant sur ca :
 

Code :
  1. <?php
  2. class AminoAcid {
  3.     var $name;  // nom aa  
  4.     var $symbol;    // symbole à trois lettres  
  5.     var $code;  // code à une lettre  
  6.     var $type;  // hydrophobique, chargé ou neutre  
  7.    
  8.     function AminoAcid ($aa) {
  9.         foreach ($aa as $k=>$v)
  10.             $this->$k = $aa[$k];
  11.     }
  12. }
  13. function readDatabase($filename) {
  14.     // read the xml database of aminoacids  
  15.     $data = implode("",file($filename));
  16.     $parser = xml_parser_create();
  17.     xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
  18.     xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
  19.     xml_parse_into_struct($parser,$data,$values,$tags);
  20.     xml_parser_free($parser);
  21.     // loop through the structures  
  22.     foreach ($tags as $key=>$val) {
  23.         if ($key == "molecule" ) {
  24.             $molranges = $val;
  25.             // each contiguous pair of array entries are the   
  26.             // lower and upper range for each molecule definition  
  27.             for ($i=0; $i < count($molranges); $i+=2) {
  28.                     $offset = $molranges[$i] + 1;
  29.                 $len = $molranges[$i + 1] - $offset;
  30.                 $tdb[] = parseMol(array_slice($values, $offset, $len));
  31.             }
  32.         } else {
  33.             continue;
  34.         }
  35.     }
  36.     return $tdb;
  37. }
  38. function parseMol($mvalues) {
  39.     for ($i=0; $i < count($mvalues); $i++)
  40.         $mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
  41.     return new AminoAcid($mol);
  42. }
  43. $db = readDatabase("moldb.xml" );
  44. echo "** Base d'objets AminoAcid :\n";
  45. print_r($db);
  46. ?>


Message édité par bl@p_psx le 05-08-2003 à 14:33:21
Reply

Marsh Posté le 05-08-2003 à 14:44:03    

BL@P_pSx a écrit :


 
ca a l'air pas mal du tout ( surtout la fin ) mais je n'y comprend pas grand chose ...
je fait quelques tests en me basant sur ca :
...


 :non: tu as recopié l'exemple de la doc mot pour mot et tu t'es dis je vais bien réussir à l'arranger à ma sauce.  
As-tu vraiment besoin d'avoir un tableau d'objet? Est-ce que tu as essayé juste avec les tableaux de valeurs et d'index si tu t'en sortais pas?
Si oui soit plus précis sur ce que tu comprends pas!

Reply

Marsh Posté le 05-08-2003 à 14:44:07    

drapal de fucker  [:risboc]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 05-08-2003 à 14:48:23    

Anapajari a écrit :


 :non: tu as recopié l'exemple de la doc mot pour mot et tu t'es dis je vais bien réussir à l'arranger à ma sauce.  
As-tu vraiment besoin d'avoir un tableau d'objet? Est-ce que tu as essayé juste avec les tableaux de valeurs et d'index si tu t'en sortais pas?
Si oui soit plus précis sur ce que tu comprends pas!


 
j'ai meme pas commencer a ecrire koi que ce soit !!!
 
je suis en train de faire quelques test ( j'ai bien dis, en train de faire ) et oui, a la 1ere lecture de la sources, j'ai pas telement compris ... mais bon, j'ai pas fait un bete copier coller, ne serais-ce que pour ouvrir mon fichier distant, ...
 
j'ai dejà trouver pas mal de sujet sur le net sur les parser, et je ne comprend pas bien le principe, mais j'y travaille !!!
 
@+

Reply

Marsh Posté le 05-08-2003 à 14:57:58    

mille pardon alors  :jap:  
Mais plutot que de commencer par les parsers moi je te conseillerais de plutot commencer par étudier le xml, c'est beaucoup plus facile de comprendre comment se servir d'un parser après. D'ailleurs si tu captes l'anglais les tutoriaux W3schools sur le xml sont pas mal du tout!

Reply

Marsh Posté le 05-08-2003 à 15:05:22    

Anapajari a écrit :

mille pardon alors  :jap:  
Mais plutot que de commencer par les parsers moi je te conseillerais de plutot commencer par étudier le xml, c'est beaucoup plus facile de comprendre comment se servir d'un parser après. D'ailleurs si tu captes l'anglais les tutoriaux W3schools sur le xml sont pas mal du tout!


 
je le ferais bien, mais pas vraiment de temps, et en fait, je le ferais surement plus tard ...  
 
Je voulais, a la base, me passer de parser, et taper dans du txt, j'ai reussi pour les joueurs ( code pas tres propre, certe ) mais j'arrive pas a dresser cette liste !!
 
exemple :  
recup des infos du joueurs en fonction de sont num = http://www.blap.net/planetside/joueur.php?num=357045
 
il faut juste que j'arrive a faire un listing des joueurs ( le fichier XML citer plus haut contient tout ce qu'il faut, sauf qu'avec ma methode, il ne lis pas les balises identique )
 
http://stats.planetsidegaming.com/ [...] /stats.xml
 
@+
 
edit : un autre menbres, a reussi a le faire en javascript, mais il utilise des activeX qui font que ces pages ne sont pas autoriser a etre executer sur les serveurWeb ( sauf chez toi avec IIS, ne marche pas avec OVH, ni Free )


Message édité par bl@p_psx le 05-08-2003 à 15:07:48
Reply

Marsh Posté le 05-08-2003 à 15:18:29    

c'est koi la meilleur solution ?
 
enfin, pas la meilleur, mais la plus pratique pour moi ?
 
celle qui me permet de faire un listing simple ( nom du joueur qui pointe vers sa fiche ) il faut donc que je recupere les balise <charid> et <nom> a chaque fois, et ensuite que je concatenne pour faire un lien ( ca devrais aller cette partie ). d'ailleur, je me demande comment lister le tableau ( surement avec un while )
 
@+

Reply

Marsh Posté le 05-08-2003 à 15:18:29   

Reply

Marsh Posté le 05-08-2003 à 15:43:00    

bon, maintenant, j'ai reussi ( apres avoir essayer pas mal de truc different, et avoir enfin compris l'utilisation de la fonction citer plus haut ) j'ai un beau tableau de la forme :
 

Code :
  1. Array
  2. (
  3.     [0] => character
  4.         (
  5.             [charid] => 341909
  6.             [name] => Denead
  7.             [battlerank] => 11
  8.             [points] => 827
  9.             [title] => Trial
  10.             [lastloggedin] => July 18, 2003
  11.         )
  12.     [1] => character
  13.         (
  14.             [charid] => 316023
  15.             [name] => kalydess
  16.             [battlerank] => 7
  17.             [points] => 7
  18.             [title] => Trial
  19.             [lastloggedin] => June 20, 2003
  20.         )
  21. [...]


 
j'aimerais faire une liste, mais je suis vraiment pas douer ... si quelq'un peux m'eclairer ( pas me donner un truc tout cuit, ca m'aiderais pas )
 
je pense faire un truc du genre :
 

Code :
  1. while ($liste != 100) {
  2. echo $liste[x][nom].'<br>';
  3. echo $liste[x][charid].'<br>';
  4. echo $liste[x][battlerank].'<br>';
  5. echo $liste[x][title].'<br>';
  6. }


 
mais je sais pas comment faire varier le [x] ??


Message édité par bl@p_psx le 05-08-2003 à 15:43:29
Reply

Marsh Posté le 05-08-2003 à 15:55:57    

Code :
  1. x = 0;
  2. while (x != 100) {
  3. echo $liste[x][nom].'<br>';
  4. echo $liste[x][charid].'<br>';
  5. echo $liste[x][battlerank].'<br>';
  6. echo $liste[x][title].'<br>';
  7. x++;
  8. }

Reply

Marsh Posté le 05-08-2003 à 16:06:19    

on va plutot apprendre à faire les choses proprement, quelque chose dans le genre:

Code :
  1. foreach($nomdetontableau as $key=>$val)
  2. {
  3.      ...
  4. }


A ce moment la dans chacune des itérations dans $key tu arraus l'indice et dans $val le tableau des valeurs.
Ainsi par exemple si tu veux afficher les données ça fait:

Code :
  1. foreach($nomdetontableau as $key=>$val)
  2. {
  3.      print "$val[nom]<br />$val[charid]<br />$val[battlerank]<br />$val[title]<br />";
  4. }


Ce qui est quand même plus clair ( à mon sens ) .

Reply

Marsh Posté le 05-08-2003 à 16:17:34    

merci a vous 2 ! je connaisais pas le foreach ... :sarcastic:  
 
sinon, Je@nb, manque les "$" mais ca doit marcher aussi ...
 
je vous tient au courant de l'avancement ...
 
merci encore !
 
@+

Reply

Marsh Posté le 05-08-2003 à 16:32:10    

ca marche pas ...
 
meme un echo

Code :
  1. $liste[1][nom]

ne marche pas  :cry:  :cry:  
 
pourtant quand je fait :
 

Code :
  1. print_r($liste)


j'ai ca :

Code :
  1. Array
  2. (
  3.     [0] => character Object
  4.         (
  5.             [charid] => 341909
  6.             [name] => Denead
  7.             [battlerank] => 11
  8.             [points] => 827
  9.             [title] => Trial
  10.             [lastloggedin] => July 18, 2003
  11.         )
  12.     [1] => character Object
  13.         (
  14.             [charid] => 316023
  15.             [name] => kalydess
  16.             [battlerank] => 7
  17.             [points] => 7
  18.             [title] => Trial
  19.             [lastloggedin] => June 20, 2003
  20.         )
  21.     [2] => character Object
  22.         (
  23.             [charid] => 337733 [......]


 
je comprend pas ...

Reply

Marsh Posté le 05-08-2003 à 16:42:05    

il marche pas le foreach?
vas-y montre tout ton code!

Reply

Marsh Posté le 05-08-2003 à 16:46:36    

Code :
  1. $liste = readDatabase("http://stats.planetsidegaming.com/outfits/21/6573/stats.xml" );
  2. foreach($liste as $key=>$val)
  3.    {
  4.          print "$val[nom]<br>$val[charid]<br>$val[battlerank]<br>$val[title]<br>";
  5.    }
  6. print_r($liste);
  7. ?>


 
la fonction readDatabase est dejà definie ci-dessus, en dehors des modifs de commentaires et autre nom de variable ...
 
j'obtient une succession de <br><br><br><br> ....
 
merci ...
ps: j'ai enlever le "/" parcequ'il le rajoutais dans les balise <br> et que c'etait un peu emettant.


Message édité par bl@p_psx le 05-08-2003 à 16:47:55
Reply

Marsh Posté le 05-08-2003 à 17:10:59    

raaaah bin evidemment ça peut pas marcher si tu te sers des fonctions qu'il y avait dans nexen. A ce moment la $liste n'est pas un tableau de tableau mais un tableau d'objet.
Il s'avère que print_r s'en sort because

Citation :

][nom]la doc php a dit[/nom]print_r affiche des informations à propos d'une variable, de manière à ce qu'elle soit lisible. Pour une chaîne, un entier ou un double, la valeur sera elle même sera affichée. Pour les tableaux, les valeurs seront présentées dans un format qui montre les clés et les valeurs. Une notation similaire est disponible pour les objets.


Donc dans ton cas il faut faire un truc dans le genre:

Code :
  1. for( $i=0; $i<count($liste); $i++)
  2.   {
  3.              $arr = get_object_vars($liste[$i]);
  4.              while (list($prop, $val) = each($arr))
  5.              {
  6.                      echo "\t$prop = $val\n<br />";
  7.              }
  8.   }


Petite question au passage t'as changé la structure de l'objet AminoAcide ou même pas?
 
ps: pour le / dans le br c'était fait exprès enfin bon fait comme tu veux!

Reply

Marsh Posté le 05-08-2003 à 17:16:42    

ok, je vais essayer ton truc ... je savais meme pas la diff entre tableau de tableau et tableau d'objet ...
 
pour la structure de AminoAcide ( character chez moi ), j'ai pas changer trop vu que j'ai egalement 4 valeur a recuperer ...
 
@+

Reply

Marsh Posté le 05-08-2003 à 17:18:52    

BL@P_pSx a écrit :


meme un echo

Code :
  1. $liste[1][nom]

ne marche pas  :cry:  :cry:  
[...]
    [1] => character Object
        (
            [charid] => 316023
            [name] => kalydess


Et la différence [name]/[nom] ça t'est pas venu à l'esprit ? :ange:


Message édité par Taiche le 05-08-2003 à 17:19:48

---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 05-08-2003 à 17:20:20    

Taiche a écrit :


Et la différence [name]/[nom] ça t'est pas venu à l'esprit ? :ange:


 
sorry, mais j'ai aussi essayer avec charid et battlerank ...

Reply

Marsh Posté le 05-08-2003 à 17:41:21    

Code :
  1. for( $i=0; $i<count($liste); $i++)
  2.     {
  3.                  $arr = get_object_vars($liste[$i]);
  4.                  while (list($prop, $val) = each($arr))
  5.                  {
  6.                            echo "\t$prop = $val\n<br />";
  7.                  }
  8.     }


 
ca marche, mais c'est pas pratique pour la mise en forme ... je vais quand meme essayer ...
 
je doit faire un truc du genre :
 

Code :
  1. echo '<a href ="http://www.blap.net/planetside/joueur.php?num=$charid">".$name."</a>';


 
avec peut etre des infos en plus ( afficher le battlerank et les pts, mais, c'est surtout la liste avec l'url qui me pose pb ...
 
ya pas moyen de transformer un tableau d'objet en tableau de tableau ??

Reply

Marsh Posté le 05-08-2003 à 17:52:02    

http://amg.sytes.net/panneaux/pano79689.png

Reply

Marsh Posté le 05-08-2003 à 17:53:51    


 
je sais meme pas ce que c'est que feof ...

Reply

Marsh Posté le 05-08-2003 à 17:54:21    

Anapajari a écrit :


 :non: tu as recopié l'exemple de la doc mot pour mot et tu t'es dis je vais bien réussir à l'arranger à ma sauce.  
As-tu vraiment besoin d'avoir un tableau d'objet? Est-ce que tu as essayé juste avec les tableaux de valeurs et d'index si tu t'en sortais pas?


tsss t'es vraiment un feignant, t'as même pas chercher à comprendre ce que remontait xml_parse_into_struct ( des tableaux de tableaux) et tu cherches mêmes pas a comprendre comment marche les objets en php( http://www.commentcamarche.net/php/phpclass.php3 ).
 
Bref tiens ça doti faire ce que tu veux, t'aurras plus qu'a recopier:

Code :
  1. for( $i=0; $i<count($liste); $i++) 
  2.    { 
  3.                 $myObj = $liste[$i];
  4.                 echo '<a href ="http://www.blap.net/planetside/joueur.php?num='.$myObj->charid.'>'.$myObj->name.'"</a>';
  5.    }

 

Reply

Marsh Posté le 05-08-2003 à 18:07:12    

je suis ce que tu apelle un feignant, et depuis ce matin, j'ai lu une bonne centaine de page sur le XML et sur le traitement de chaine en PHP, alors, j'ai peut-etre oublier de potasser les objet ( je sais meme pas ce que c'est ) ... maintenant, si tu me dis comment ca marche plutot que de dire que je fait rien ... ca me ferais avancer ...
J'ai compris ( c'est un grand mot ) ce que faisais le scirpt de nexen, mais de la a dire que j'ai compris la programation orienter objet ... :sarcastic:  :o  
Alors, je potasse et encore desoler d'etre un newb en php, j'ai surement d'autre domaine que je maitrise plus.
 
 :hello: et merci !
 
edit: je vient de lire ca : http://www.commentcamarche.net/php/phpclass.php3 et je comprend pas grand chose, mais ca vas venir ...


Message édité par bl@p_psx le 05-08-2003 à 18:08:24
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed