Page 1 sur 1

lire la ligne suivante.

Posté : 01 août 2013, 12:31
par corneliux
Bonjour à tous,
je suis en train de tenter de réaliser un petit script, mais je bloque sur un problème.
- J'ai un fichier "upload.txt' situé dans un répertoire de mon serveur.
- Je cherche une valeur (dans l'exemple, mon pseudo : corneliux) dans ce fichier. NB : la valeur apparait plusieurs fois dans le fichier.
- Je parviens à trouver cette valeur.
- Mais ce que je veux mettre en variable, ce n'est pas cette ligne, mais la ligne suivante, et ça, je ne sais pas faire.

Voici un extrait du fichier upload que je traite :

Code : Tout sélectionner

</groundspeak:long_description> <groundspeak:encoded_hints>entonnoir</groundspeak:encoded_hints> <groundspeak:logs> <groundspeak:log id="329446625"> <groundspeak:date>2013-07-13T19:00:00Z</groundspeak:date> <groundspeak:type>Found it</groundspeak:type> <groundspeak:finder id="5118841">adesio</groundspeak:finder> <groundspeak:text encoded="False">2 petits tours d église pour reperer la cache et hop MPLC</groundspeak:text> </groundspeak:log> <groundspeak:log id="328375452"> <groundspeak:date>2013-07-05T19:00:00Z</groundspeak:date> <groundspeak:type>Found it</groundspeak:type> <groundspeak:finder id="7600084">lupauwiltho</groundspeak:finder> <groundspeak:text encoded="False">et de 4!!!</groundspeak:text> </groundspeak:log> <groundspeak:log id="326162992"> <groundspeak:date>2013-06-30T19:00:00Z</groundspeak:date> <groundspeak:type>Found it</groundspeak:type> <groundspeak:finder id="6269532">paulterguest</groundspeak:finder> <groundspeak:text encoded="False">en route pour l'eglise suivante:) un cache vite trouvé, malgre des voisin un petit peu curieux! merci pour la cache!</groundspeak:text> </groundspeak:log> <groundspeak:log id="323823069"> <groundspeak:date>2013-06-21T19:00:00Z</groundspeak:date> <groundspeak:type>Found it</groundspeak:type> <groundspeak:finder id="1794567">Luna49</groundspeak:finder> <groundspeak:text encoded="False">En route vers Laon. Merci pour la cache.</groundspeak:text> </groundspeak:log> <groundspeak:log id="322867297"> <groundspeak:date>2013-06-16T19:00:00Z</groundspeak:date> <groundspeak:type>Found it</groundspeak:type> <groundspeak:finder id="5589534">Corneliux</groundspeak:finder> <groundspeak:text encoded="False">Jour de mariage lors du premier passage, je logue tranquillement cette fois ci.</groundspeak:text> </groundspeak:log> </groundspeak:logs> <groundspeak:travelbugs /> </groundspeak:cache> </wpt>
et voici le code que j'ai pour le moment pour récupérer les données dont j'ai besoin :

Code : Tout sélectionner

/*******************************************************************************************/ //Lecture du fichier et extraction du TITRE et des COORDONNES DE LA CACHE $i = 0; $j = 0; /*Ouverture du fichier en lecture seule*/ //$handle = fopen('fichier.gpx', 'r'); $handle = fopen('tmp/upload.txt', 'r+'); /*Si on a réussi à ouvrir le fichier*/ if ($handle){ /*Tant que l'on est pas à la fin du fichier*/ while (!feof($handle)){ /*On lit la ligne courante*/ $buffer = fgets($handle); /*On cherche si c'est la ligne des coordonnées de la cache*/ if (preg_match("#<wpt lat=#i", "'.$buffer.'")){ //echo $buffer; $tab_coord = explode("\"",$buffer); //coord de la cache // echo "Longitude : ".$tab_coord[1]." Lattitude : ".$tab_coord[3]."<br>"; $tablo_lattitude[$j] = $tab_coord[1]; $tablo_longitude[$j] = $tab_coord[3]; $j++; } /*On cherche si c'est la ligne du nom de la cache*/ if (preg_match("#<urlname>#i", "'.$buffer.'")){ eregi("<urlname>(.*)</urlname>",$buffer,$tab_nom); //Nom de la cache // echo "<strong>".htmlentities($tab_nom[1])."</strong><br>"; $tablo_nom[$i] = htmlentities($tab_nom[1]); $i++; } /*On cherche si c'est la ligne du log du pseudo*/ if (preg_match("#>".$_POST['pseudo']."<#i", "'.$buffer.'")){ C'EST ICI QUE JE GADOUILLE ??????????????????????????????????????????? } } /*On ferme le fichier*/ fclose($handle); }
Comme vous pouvez le voir, la ligne ou il y a mon pseudo ne m'intéresse pas, mais je souhaiterais pouvoir récupérer la ligne suivante afin de récupérer tout mes commentaires qui sont entre les balises "<groundspeak:text encoded="False">" et "</groundspeak:log>".

Quelqu'un peut m'aider ? Parce que là, je ne vois vraiment pas comment faire !!!!
Merci d'avance pour vos pistes, conseils..... solutions ! :P

Re: lire la ligne suivante.

Posté : 01 août 2013, 14:06
par Mazarini
Tu devrais regarder du coté de DOMdocument (http://www.php.net/manual/fr/class.domdocument.php).

Re: lire la ligne suivante.

Posté : 02 août 2013, 16:53
par corneliux
Je ne peux pas répondre ! Dès que je veux valider mon message, j'ai écrit en rouge au dessus du message :
This message was flagged as spam and has been denied.
Je vais essayer de recréer un sujet....

Re: lire la ligne suivante.

Posté : 04 août 2013, 12:45
par moogli
les soucis de réponse c'est parce que tu n'a pas encore assez de message ;) (au pire tu peux éditer ton message parfois c’est mieux).

ton xml avec le namespace ça met un peu le souk, php à pas trop l'air d'aimer :s


pour le principe j'ai virer tous les "groundspeak" afin de tester facilement.
tu option ce que tu veux avec une requête xpath (plus une boucle me suis pas foulé, comme ça tu peux aussi afficher le contenu des logs
<?php
try {
    $xmlfile = 'corneliux.xml';
    if (file_exists($xmlfile)) {
        $xml = simplexml_load_file($xmlfile);
        $xpath = '//logs/log'; // tous les logs
        foreach($xml->xpath($xpath) as $n) {
            if($n->finder == 'Corneliux'){
                xdebug_var_dump($n);
            }
        }
    }
} catch (Exception $e) {
    xdebug_var_dump($e);
}
résultat
object(SimpleXMLElement)[16]
public '@attributes' =>
array (size=1)
'id' => string '319379657' (length=9)
public 'date' => string '2013-06-02T19:00:00Z' (length=20)
public 'type' => string 'Found it' (length=8)
public 'finder' => string 'Corneliux' (length=9)
public 'text' => string 'Mon premier FTF :-), by night évidemment !
Merci Cachcaillou.

This entry was edited by Corneliux on Sunday, 02 June 2013 at 23:18:39 UTC.' (length=179)
(c'est le nœud complet).

et si tu ne veux que l'élément qui t'appartient la requete xpath devient
<?php
$xpath = '//logs/log[finder=\'Corneliux\']';
c'est pas plus complexe ;)

par contre j'ai pas réussi avec le namespace groundspeak (en java ou en php même combat).
si tu maitrise la génération ce serait p'tet plus simple si tu peux virer ça ;)

j'allais oublier : un lien avec la syntaxe xpath : http://www.w3schools.com/xpath/xpath_syntax.asp

@+

Re: lire la ligne suivante.

Posté : 04 août 2013, 16:48
par corneliux
Alors là, un grand merci =D> C'est exactement ce que je voulais faire !
J'ai regardé en long en large et en travers la doc pour xpath, mais je ne sais pas pourquoi, je n'arrivais jamais à sortir ce que je voulais. Je crois que j'avais mis un "=" au lieu de "==" ... :oops:
Vraiment, merci merci et encore merci, je vais mettre ça en application demain.
Et pour les groundspeak, je virerais tout ça avec un str_ireplace en php, c'est pas un problème.

Re: lire la ligne suivante.

Posté : 04 août 2013, 21:42
par moogli
Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton vert "Mettre le sujet en tant que Résolu" situé en haut de la page à côté du titre du sujet.