IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

Perl et attribut xml : Twig ?


Sujet :

Modules Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut Perl et attribut xml : Twig ?
    Bonjour à tous,

    j'ai suivi l'excellent tutoriel Perl de Djibril, en pensant que le xml::twig pouvait m'aider...
    http://djibril.developpez.com/tutoriels/perl/perl-xml/
    mais je n'arrive pas à l'adapter.

    Mon problème est simple, mon xml contient mes informations uniquement à l'intérieur des balises

    NOTA : la partie xml avant ce code ne comporte rien de particulier.

    Moi en gros j'aimerais récupérer les valeurs de n, nc, km etc... pour chaque <pt>
    Après, je pense savoir adapter le code de Djibril, c'est juste que pour le moment je ne sais pas quel syntaxe adopter pour avoir accès...

    Mes excuses, je débute... d'avance merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="coureur.xsl.php"?>
     
      <pts>
       <pt idpt="0" n="Orsieres" nc="Depart" km="0" d="0" a="911" x="50" y="154" lon="7.1463" lat="46.0304" meet="1" />
       <pt idpt="20" n="Champex-Lac" nc="Champex" km="7.61" d="604" a="1482" x="165" y="105" lon="7.12048" lat="46.0277" meet="1" />
       <pt idpt="21" n="La Giete" nc="Giete" km="18.74" d="1469" a="1883" x="334" y="71" lon="7.03381" lat="46.0559" />
       <pt idpt="23" n="Trient" nc="Trient" km="23.52" d="1527" a="1303" x="406" y="120" lon="6.99552" lat="46.056" meet="1" />
       <pt idpt="24" n="Catogne" nc="Catogne" km="28.9" d="2326" a="2005" x="488" y="61" lon="6.96913" lat="46.0398" />
       <pt idpt="25" n="Vallorcine" nc="Vallo" km="33.97" d="2353" a="1263" x="565" y="124" lon="6.93234" lat="46.0321" meet="1" />
       <pt idpt="91" n="La Flegere" nc="Flegere" km="44.89" d="3283" a="1871" x="730" y="72" lon="6.88715" lat="45.9601" />
       <pt idpt="94" n="Chamonix" nc="Arrivee" km="52.12" d="3374" a="1036" x="840" y="143" lon="6.86897" lat="45.9236" meet="1" />[/INDENT]
    </pts>

  2. #2
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Bonjour,

    pour un problème aussi simple tu peux t'en sortir avec des expressions régulières (\042 est le caractère ", on aurait pu utiliser " directement mais cette forme facilite la vie aux coloriseurs syntaxiques):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    Taisha:~/perl/forum $ perl -MData::Dump -0ne 'dd map { my %h = m/(\S+?)=\042([^\042]*)\042/g; \%h } m{<pt (.*?)/>}g' xml.dat
    (
      {
        a => 911,
        d => 0,
        idpt => 0,
        km => 0,
        lat => 46.0304,
        lon => 7.1463,
        meet => 1,
        n => "Orsieres",
        nc => "Depart",
        x => 50,
        y => 154,
      },
      {
        a => 1482,
        d => 604,
        idpt => 20,
        km => 7.61,
        lat => 46.0277,
        lon => 7.12048,
        meet => 1,
        n => "Champex-Lac",
        nc => "Champex",
        x => 165,
        y => 105,
      },
      {
        a => 1883,
        d => 1469,
        idpt => 21,
        km => 18.74,
        lat => 46.0559,
        lon => 7.03381,
        n => "La Giete",
        nc => "Giete",
        x => 334,
        y => 71,
      },
      {
        a => 1303,
        d => 1527,
        idpt => 23,
        km => 23.52,
        lat => 46.056,
        lon => 6.99552,
        meet => 1,
        n => "Trient",
        nc => "Trient",
        x => 406,
        y => 120,
      },
      {
        a => 2005,
        d => 2326,
        idpt => 24,
        km => 28.9,
        lat => 46.0398,
        lon => 6.96913,
        n => "Catogne",
        nc => "Catogne",
        x => 488,
        y => 61,
      },
      {
        a => 1263,
        d => 2353,
        idpt => 25,
        km => 33.97,
        lat => 46.0321,
        lon => 6.93234,
        meet => 1,
        n => "Vallorcine",
        nc => "Vallo",
        x => 565,
        y => 124,
      },
      {
        a => 1871,
        d => 3283,
        idpt => 91,
        km => 44.89,
        lat => 45.9601,
        lon => 6.88715,
        n => "La Flegere",
        nc => "Flegere",
        x => 730,
        y => 72,
      },
      {
        a => 1036,
        d => 3374,
        idpt => 94,
        km => 52.12,
        lat => 45.9236,
        lon => 6.86897,
        meet => 1,
        n => "Chamonix",
        nc => "Arrivee",
        x => 840,
        y => 143,
      },
    )
    Taisha:~/perl/forum $
    Comme tu débutes, quelques explications :

    perl -0ne '...' xml.dat va lire l'ensemble du ou des fichier(s) passé(s) en paramètre dans $_. Ici il n'y en a qu'un, c'est xml.dat. La documentation de ces paramètres (-0, -n, etc...) est ici.

    Dans les deux utilisations de l'opérateur de matching m/.../, on utilise le modifier g (m/.../g) qui indique d'effectuer un matching global. En contexte de liste, ceci produit la liste de tous les groupes capturants dans l'expression régulière utilisée. Documentation ici.

    Pour m{<pt (.*?)/>}g, le contexte de liste est fourni par le map qui précède, il n'y a qu'un groupe capturant et l'opérateur produit une liste de chaînes de caractères, à raison d'une pour chaque <pt ... \>, contenant les définitions d'attributs. On peut le vérifier par exemple avec le code ci-dessous (les arguments d'un appel de fonction, ici dd, sont également évalués en contexte de liste) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Taisha:~/perl/forum $ perl -MData::Dump -0ne 'dd m{<pt (.*?)/>}g' xml.dat
    (
      "idpt=\"0\" n=\"Orsieres\" nc=\"Depart\" km=\"0\" d=\"0\" a=\"911\" x=\"50\" y=\"154\" lon=\"7.1463\" lat=\"46.0304\" meet=\"1\" ",
      "idpt=\"20\" n=\"Champex-Lac\" nc=\"Champex\" km=\"7.61\" d=\"604\" a=\"1482\" x=\"165\" y=\"105\" lon=\"7.12048\" lat=\"46.0277\" meet=\"1\" ",
      "idpt=\"21\" n=\"La Giete\" nc=\"Giete\" km=\"18.74\" d=\"1469\" a=\"1883\" x=\"334\" y=\"71\" lon=\"7.03381\" lat=\"46.0559\" ",
      "idpt=\"23\" n=\"Trient\" nc=\"Trient\" km=\"23.52\" d=\"1527\" a=\"1303\" x=\"406\" y=\"120\" lon=\"6.99552\" lat=\"46.056\" meet=\"1\" ",
      "idpt=\"24\" n=\"Catogne\" nc=\"Catogne\" km=\"28.9\" d=\"2326\" a=\"2005\" x=\"488\" y=\"61\" lon=\"6.96913\" lat=\"46.0398\" ",
      "idpt=\"25\" n=\"Vallorcine\" nc=\"Vallo\" km=\"33.97\" d=\"2353\" a=\"1263\" x=\"565\" y=\"124\" lon=\"6.93234\" lat=\"46.0321\" meet=\"1\" ",
      "idpt=\"91\" n=\"La Flegere\" nc=\"Flegere\" km=\"44.89\" d=\"3283\" a=\"1871\" x=\"730\" y=\"72\" lon=\"6.88715\" lat=\"45.9601\" ",
      "idpt=\"94\" n=\"Chamonix\" nc=\"Arrivee\" km=\"52.12\" d=\"3374\" a=\"1036\" x=\"840\" y=\"143\" lon=\"6.86897\" lat=\"45.9236\" meet=\"1\" ",
    )
    Taisha:~/perl/forum $
    Le bloc { my %h = m/(\S+?)=\042([^\042]*)\042/g; \%h } du map, qui va être évalué pour chacune des chaînes ci-dessus, extrait les paires attributs="valeur" de la chaîne et s'en sert pour construire un hash, qui est retourné (via une référence) comme résultat. Ici c'est l'affectation à %h qui fournit le contexte de liste à l'évaluation de m/.../g. Cela fonctionne car chaque match produit une liste de deux élements (attribut, valeur), et c'est la liste résultante de tous les matches qui est affectée à %h, les éléments d'indice pair (démarrant à 0) étant utilisés comme clé, et les éléments d'indice impair comme valeur.

    L'appel à dd (fourni par Data::Dump) imprime la liste des hashes ainsi produits.
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  3. #3
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Bonsoir à toi et merci de ton retour.
    Pour être honnête, je n'ai pas tout compris... mais j'ai un peu travaillé en parrallèle avec les exemples de Djibril.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #!/usr/bin/perl
    use Carp;
    use strict;
    use warnings;
    use XML::Twig;
     
    # Création du fichier résultat
    my $FichierResulat = 'resultat.txt';
    open( my $FhResultat, '>', $FichierResulat )
      or die("Impossible d'ouvrir le fichier $FichierResulat\n$!");
     
     
    my $t = XML::Twig->new( 
      twig_handlers => { 
        'identite' => \&personne, 
      } 
    );
    $t->parsefile('live.xml');
     
    my $t0 = XML::Twig->new( 
      twig_handlers => { 
        'pt' => \&Suivi, 
      } 
    );
    $t0->parsefile('live.xml');
     
    #----------------------------
    # Function
     
    sub personne {
    print "\n\n";
    	print {$FhResultat} "", "=" x 40, "\n";
        my ($twig, $twig_element) = @_;
        my $prenom = $twig_element->att('prenom');
    	my $nom = $twig_element->att('nom');
    	my $sx=$twig_element->att('sx');
        print {$FhResultat} "Suivi de $prenom $nom de sexe $sx\n";
    	print {$FhResultat} "", "=" x 40, "\n";
    	print {$FhResultat} "\n\n";
    }
     
     
    sub Suivi {
        my ($twig, $twig_element) = @_;
        my $km = $twig_element->att('km');
    	my $point = $twig_element->att('n');
    	my $d=$twig_element->att('d');
        print {$FhResultat} "Passage a $point\n";
    	print {$FhResultat} "kilometre $km - D+=$d m\n";
    	print {$FhResultat} "", "-" x 40, "\n";
     
    }
    Ce code fait exactement ce que je veux, au défaut près qu'il utilise handlers et que donc il ne me récupère les infos que partiellement. Je ne peux pas utiliser d'attributs "identités" dans la fonction "suivi". C'est assez gênant, en particuler car les heures de passages sont dans les données <e> alors que les kilomètres et les noms des points de passage sont dans <pt>...

    Le must, j'aimerais justement faire une sortie "$nom est passé à $point à $heure", sachant que $nom est plutôt dans <identite>, $point dans <pt> et $heure sera dans <e>.

    Je pense du coup qu'il ne faut PAS utiliser handlers pour faire des fonctions qui ont accès à toutes les infos...

    J'ai bien essayé mais entre les children et grand children je m'y perds complétement. J'ai pourtant l'impression de plus être bien loin!

    je met le xml complet également :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="coureur.xsl.php"?><d rech="thevenard"><courses><c id="utmb" n="UTMB®" nc="UTMB®" /><c id="ccc" n="CCC®" nc="CCC®" /><c id="tds" n="TDS®" nc="TDS®" /><c id="occ" n="OCC" nc="OCC" /><c id="ptl" n="PTL®" nc="PTL®" /><c id="ycc" n="#YCC" nc="#YCC" /></courses>		  <fiche doss="8" c="utmb"  >
    			<dotvision>http://live2.dotvision.com/live/mobile?guid=1be6c89d-4351-4df2-a809-e6a7e88bbf12&amp;favoris=9794&amp;intro=false</dotvision>			<identite nom="THEVENARD"
    			  prenom="Xavier"			  cat="SE H"
    			  sx="H"
    			  descat="23-39"
    			  club="/"			  			  
    			  				  nat="France"
    				  cio="FRA"			  			  				  				  ville="JOUGNE" pays="FR"
    			  			/>
    																					<state code="f" clt="1" cltcat="1" />			<prev >
    			  			</prev>
    						<pass>
    			<e idpt="0" hd="18:00:11" jd="5" tps="00:00:00" clt="-" tn="0" ></e>
    <e idpt="1" ha="19:14:57" ja="5" tps="01:14:46" tn="1.2461111111111" tnp="1.2461111111111" clt="6" ></e>
    <e idpt="2" ha="19:49:19" ja="5" tps="01:49:08" tn="1.8188888888889" tnp="0.57277777777778" clt="8" ></e>
    <e idpt="3" ha="20:47:46" ja="5" tps="02:47:35" tn="2.7930555555556" tnp="0.97416666666667" clt="4" ></e>
    <e idpt="4" ha="21:44:50" ja="5" tps="03:44:39" tn="3.7441666666667" tnp="0.95111111111111" clt="2" ></e>
    <e idpt="5" ha="22:44:19" ja="5" tps="04:44:08" tn="4.7355555555556" tnp="0.99138888888889" clt="3" ></e>
    <e idpt="6" ha="23:13:08" ja="5" hd="23:15:05" jd="5" tps="05:12:57" tn="5.2158333333333" tnp="0.48027777777778" clt="4" ></e>
    <e idpt="7" ha="00:37:37" ja="6" tps="06:37:26" tn="6.6238888888889" tnp="1.3755555555556" clt="1" ></e>
    <e idpt="8" ha="01:30:04" ja="6" tps="07:29:53" tn="7.4980555555556" tnp="0.87416666666667" clt="1" ></e>
    <e idpt="9" ha="02:10:10" ja="6" tps="08:09:59" tn="8.1663888888889" tnp="0.66833333333333" clt="1" ></e>
    <e idpt="10" ha="02:35:11" ja="6" tps="08:35:00" tn="8.5833333333333" tnp="0.41694444444444" clt="1" ></e>
    <e idpt="11" ha="03:00:37" ja="6" tps="09:00:26" tn="9.0072222222222" tnp="0.42388888888889" clt="1" ></e>
    <e idpt="12" ha="03:03:59" ja="6" tps="09:03:48" tn="9.0633333333333" tnp="0.056111111111111" clt="1" ></e>
    <e idpt="14" ha="03:58:55" ja="6" tps="09:58:44" tn="9.9788888888889" tnp="0.91555555555556" clt="1" ></e>
    <e idpt="15" ha="04:48:25" ja="6" tps="10:48:14" tn="10.803888888889" tnp="0.825" clt="1" ></e>
    <e idpt="16" ha="05:24:08" ja="6" tps="11:23:57" tn="11.399166666667" tnp="0.59527777777778" clt="1" ></e>
    <e idpt="17" ha="06:18:23" ja="6" tps="12:18:12" tn="12.303333333333" tnp="0.90416666666667" clt="2" ></e>
    <e idpt="18" ha="07:10:03" ja="6" hd="07:11:15" jd="6" tps="13:09:52" tn="13.164444444444" tnp="0.86111111111111" clt="1" ></e>
    <e idpt="20" ha="08:36:24" ja="6" hd="08:39:24" jd="6" tps="14:36:13" tn="14.603611111111" tnp="1.4191666666667" clt="1" ></e>
    <e idpt="21" ha="10:11:35" ja="6" tps="16:11:24" tn="16.19" tnp="1.5363888888889" clt="1" ></e>
    <e idpt="23" ha="10:38:27" ja="6" hd="10:42:26" jd="6" tps="16:38:16" tn="16.637777777778" tnp="0.44777777777778" clt="1" ></e>
    <e idpt="24" ha="11:43:42" ja="6" tps="17:43:31" tn="17.725277777778" tnp="1.0211111111111" clt="1" ></e>
    <e idpt="25" ha="12:17:13" ja="6" hd="12:21:24" jd="6" tps="18:17:02" tn="18.283888888889" tnp="0.55861111111111" clt="1" ></e>
    <e idpt="28" ha="13:56:10" ja="6" tps="19:55:59" tn="19.933055555556" tnp="1.5794444444444" clt="1" ></e>
    <e idpt="91" ha="14:26:54" ja="6" tps="20:26:43" tn="20.445277777778" tnp="0.51222222222222" clt="1" ></e>
    <e idpt="94" ha="15:09:26" ja="6" hd="17:48:10" jd="6" tps="21:09:15" tn="21.154166666667" tnp="0.70888888888889" clt="1" ></e>		  </pass>
     
     
     
     
    		  <pts>
    <pt idpt="0" n="Chamonix" nc="Depart" km="0" d="0" a="1036" x="50" y="144" lon="6.86876" lat="45.9237" meet="1" />
    <pt idpt="1" n="Le Delevret" nc="Delev" km="13.56" d="870" a="1739" x="113" y="96" lon="6.75676" lat="45.8792" />
    <pt idpt="2" n="Saint Gervais" nc="StGer" km="20.83" d="959" a="815" x="147" y="159" lon="6.71168" lat="45.8934" meet="1" />
    <pt idpt="3" n="Les Contamines" nc="Conta" km="31.11" d="1536" a="1160" x="195" y="135" lon="6.72671" lat="45.8227" meet="1" />
    <pt idpt="4" n="La Balme" nc="Balme" km="39.24" d="2076" a="1699" x="232" y="98" lon="6.7111" lat="45.7579" />
    <pt idpt="5" n="Ref. Croix Bonhomme" nc="Bonhom" km="44.78" d="2876" a="2441" x="258" y="48" lon="6.71771" lat="45.7221" />
    <pt idpt="6" n="Les Chapieux" nc="Chapieu" km="50.06" d="2876" a="1553" x="283" y="108" lon="6.73389" lat="45.6965" t="D" meet="1" />
    <pt idpt="7" n="Col de la Seigne" nc="Seigne" km="60.2" d="3849" a="2507" x="330" y="44" lon="6.80714" lat="45.7514" />
    <pt idpt="8" n="Lac Combal" nc="Combal" km="66.72" d="4107" a="1964" x="360" y="80" lon="6.85594" lat="45.7705" />
    <pt idpt="9" n="Arrete du Mont-Favre" nc="MtFavre" km="70.57" d="4570" a="2409" x="378" y="50" lon="6.89016" lat="45.7723" />
    <pt idpt="10" n="Col Chécrouit" nc="Checrou" km="75.05" d="4580" a="1958" x="399" y="81" lon="6.93111" lat="45.7906" />
    <pt idpt="11" n="Courmayeur - Dolonne Entrée" nc="Courm1" km="79.35" d="4586" a="1191" x="419" y="133" lon="6.96495" lat="45.7941" meet="1" />
    <pt idpt="12" n="Courmayeur - Dolonne Sortie" nc="Courm2" km="79.35" d="4586" a="1191" x="419" y="133" lon="6.96495" lat="45.7941" meet="1" />
    <pt idpt="14" n="Refuge Bertone" nc="Bertone" km="84.07" d="5391" a="1977" x="441" y="80" lon="6.97842" lat="45.8091" />
    <pt idpt="15" n="Refuge Bonatti" nc="Bonatti" km="91.43" d="5680" a="2015" x="475" y="77" lon="7.0329" lat="45.8469" />
    <pt idpt="16" n="Arnuva" nc="Arnuva" km="96.62" d="5808" a="1772" x="499" y="94" lon="7.05272" lat="45.8713" meet="1" />
    <pt idpt="17" n="Grand Col Ferret" nc="GdColF" km="101.05" d="6569" a="2527" x="520" y="42" lon="7.07781" lat="45.8887" />
    <pt idpt="18" n="La Fouly" nc="Fouly" km="111.04" d="6704" a="1603" x="566" y="105" lon="7.0984" lat="45.9357" t="D" meet="1" />
    <pt idpt="20" n="Champex-Lac" nc="Champex" km="125.04" d="7308" a="1482" x="632" y="113" lon="7.12048" lat="46.0277" t="D" meet="1" />
    <pt idpt="21" n="La Giete" nc="Giete" km="136.17" d="8173" a="1883" x="683" y="86" lon="7.03381" lat="46.0559" />
    <pt idpt="23" n="Trient" nc="Trient" km="140.95" d="8231" a="1303" x="706" y="125" lon="6.99552" lat="46.056" t="D" meet="1" />
    <pt idpt="24" n="Catogne" nc="Catogne" km="146.33" d="9030" a="2005" x="731" y="78" lon="6.96913" lat="46.0398" />
    <pt idpt="25" n="Vallorcine" nc="Vallo" km="151.41" d="9057" a="1263" x="754" y="128" lon="6.93234" lat="46.0321" t="D" meet="1" />
    <pt idpt="28" n="La Tete aux vents" nc="TaVents" km="159.08" d="9930" a="2116" x="790" y="70" lon="6.90657" lat="45.9824" />
    <pt idpt="91" n="La Flegere" nc="Flegere" km="162.62" d="9992" a="1871" x="806" y="87" lon="6.88715" lat="45.9601" />
    <pt idpt="94" n="Chamonix" nc="Arrivee" km="169.86" d="10083" a="1036" x="840" y="144" lon="6.86897" lat="45.9236" meet="1" /></pts>		  			</fiche>
    </d>
    Pour info enfin, ceci est la première étape. Enfait ce fichier xml vient d'une page web, et dans la suite de mon développement il faudra que j'aille chercher directement sur le web le fichier xml.

    Encore merci à vous

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kenobiwan88 Voir le message
    Pour info enfin, ceci est la première étape. Enfait ce fichier xml vient d'une page web, et dans la suite de mon développement il faudra que j'aille chercher directement sur le web le fichier xml.
    Dans ce cas, il vaut peut-être mieux décoder directement le HTML plutôt que passer par un intermédiaire XML, non?

    Sinon, utilise un module comme Data:: Dumper pour afficher la structure que te renvoie XML::Twig, ça devrait t'aider à savoir où et comment récupérer les données que tu recherches.

  5. #5
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    {
      my ($prenom, $nom, $sx);
     
      sub personne {
         ...
         $prenom = $twig_element->att('prenom');
         ...
      }
     
      sub Suivi {
        ...
        # tu peux utiliser $prenom ici
        ...
      }
    }
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  6. #6
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Dans ce cas, il vaut peut-être mieux décoder directement le HTML plutôt que passer par un intermédiaire XML, non?

    Sinon, utilise un module comme Data:: Dumper pour afficher la structure que te renvoie XML::Twig, ça devrait t'aider à savoir où et comment récupérer les données que tu recherches.
    Salut,

    merci de ton retour.

    Enfait la page de base est déja en xml.

    Je donne le détail : Mon outil se veut être pour faire du suivi des épreuves de course à pied. L'adresse première est la suivante : http://utmb.livetrail.net/coureur.php, puis il faut rentrer un nom ou numéro "8" par exemple, qui donne accès au .xml que j'ai copié précédemment.

    J'ai soumis mes questions relatives à la deuxième partie, ou je travaillais en local sur le xml que j'ai copié / collé.

    Mais dans un futur (très) proche, j'aimerai que le script :
    - se connecte sur http://utmb.livetrail.net/coureur.php
    - rentrer le numéro de dossard que j'aurais défini dans le script
    - valide
    - traite la page xml détaillée (script déja posté avant, à voir si on peut la traiter "en ligne" ou si je dois enregistrer le xml pour le traiter en local)

    Débutant, je cherche actuellement en parallèle la méthode pour entrer le numéro de dossard et valider, ça doit pas être compliqué mais quand on commence...

    En résumé, pour moi tout est en xml quand je fais "afficher le code source de la page"

    NOTA : merci cmcmc, cela semble pas mal du tout, je te tiens au courant !!

    Merci bien !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Encore moi messieurs, ça avance !

    Je pense qu'avant de m'attaquer à la partie "online", il me reste un petit soucis à résoudre.

    Les informations relatives à l'heure sont dans la balise <pass> puis <e>.
    Je crée donc un sub qui remplit un tableau @horaire en fonction de la valeur de idpt, qui ont la bonne idée d'être les mêmes que dans <pt>.

    Ca ca marche bien, @horaire se remplit parfaitement.
    Par contre dans le sub "suivi", quand je fais appel à @horaire avec le pointeur $ident2 qui correspondant aussi à la valeur de idpt mais dans <pt> cette fois ca plante...

    Pourtant j'ai bien fait attention de définir @horaire en dehors de toute fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #!/usr/bin/perl
    use Carp;
    use strict;
    use warnings;
    use XML::Twig;
     
    # Création du fichier résultat
    my $FichierResulat = 'resultat.txt';
    open( my $FhResultat, '>', $FichierResulat )
      or die("Impossible d'ouvrir le fichier $FichierResulat\n$!");
     
     # récupération des infos relatives au nom de la course
    my $t1 = XML::Twig->new( 
      twig_handlers => { 
        'fiche' => \&course, 
      } 
    );
    $t1->parsefile('live.xml'); 
     
    # récupération des infos relatives au coureur
    my $t = XML::Twig->new( 
      twig_handlers => { 
        'identite' => \&personne, 
      } 
    );
    $t->parsefile('live.xml');
     
    #---------------------------------------------
    # récupération des infos relatives au points de passage
    my $t0 = XML::Twig->new( 
      twig_handlers => { 
        'pt' => \&Suivi, 
      } 
    );
    $t0->parsefile('live.xml');
     
    #----------------------------
     
     
    # récupération des infos relatives aux heures
    my $t2 = XML::Twig->new( 
      twig_handlers => { 
        'pass/e' => \&heure, 
      } 
    );
    $t2->parsefile('live.xml');
     
    #----------------------------
     
    # Function
     
     my ($prenom, $nom, $sx, $heure, $altitude, $d, $km, $point, $nc, $nomcourse,$ident, $ident2, $temps, @horaire, @temps);
     
     for (my $i = 0; $i <= 1000; $i++) {
       $horaire[$i]=0;#Création du tableau qui va contenir toutes les heures en fonction de la valeur idpt
    }
     
     
     {
     
     # Récupération des informations courses
      sub course {
        my ($twig, $twig_element) = @_;
         $nomcourse = $twig_element->att('c');
    }
     
    # Récupération des informations heures
    sub heure {
        my ($twig, $twig_element) = @_;
     
    	$ident = int($twig_element->att('idpt')); #on récupère le idpt qu'on retrouvera dans <pt>
    	$heure = $twig_element->att('tps');
    	$horaire[$ident]=$heure; #on remplit le tableau d'horaire avec les différentes heures, le reste reste à 0.
    print "$horaire[$ident]\n"; # ça ca fonctionne, le tableau se remplit bien
     
    }
     
     
     #récupération des infos du coureur
    sub personne {
    print "\n\n";
    	print {$FhResultat} "", "=" x 40, "\n";
        my ($twig, $twig_element) = @_;
         $prenom = $twig_element->att('prenom');
    	 $nom = $twig_element->att('nom');
    	 $sx=$twig_element->att('sx');
        print {$FhResultat} "Suivi de $prenom $nom, qui participe à l'epreuve $nomcourse\n";
    	print {$FhResultat} "", "=" x 40, "\n";
    	print {$FhResultat} "\n\n";
    }
     
     #Suivi et affichage
    sub Suivi {
        my ($twig, $twig_element) = @_;
        $km = $twig_element->att('km');
    	 $point = $twig_element->att('n');
    	  $d=$twig_element->att('d');
    	  $nc=$twig_element->att('nc');
    	  $ident2=int($twig_element->att('idpt')); #on récupérer l'idpt du <p> pour aller rechercher le bon temps dans le tableau @horaire
     
        print {$FhResultat} "$prenom $nom est passe a $point\n";
    	print {$FhResultat} "kilometre $km - D+=$d m\n";
    	#print "$horaire[0]\n";
    	#print {$FhResultat} "Temps de course :  $horaire[$ident2]\n";
    	print {$FhResultat} "", "-" x 40, "\n";
     
    	}
     
    }

    Encore merci de votre mobilisation !

    [edit : apparemment, les tableaux ne se comportent pas comme les variables standard, une fois sortie de la routine sub heure, le tableau @horaire ne contient que des zéros...]

  8. #8
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    tu peux capturer toutes les infos dint tu as besoin, et une fois que c'est fait, produire ton résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Taisha:~/perl/forum $ cat ok88.pl
    use strict;
    use warnings;
    use XML::Twig;
     
    my ($filename) = @ARGV;
     
    {
        my $c;
     
        XML::Twig->new(
    	twig_handlers => {
    	    map { my ($name, $id, $wanted_atts) = @$_; 
    		  $name => sub { my ($t, $e) = @_;
    				 my %h = map { $_ => $e->att($_)} @$wanted_atts;
    				 if ($id) {
    				     $c->{$name}{$h{$id}} = \%h;
    				 } else {
    				     push @{$c->{$name}}, \%h;
    				 }
    		  } }
    	    ['identite', undef, [qw(nom prenom sx)]],
    	    ['e', 'idpt', [qw(idpt ha ja tps tn tnp clt)]],
    	    ['pt', 'idpt', [qw(idpt n nc km d a x ylon lat meet)]]
    	}) ->parsefile($filename);
     
        use Data::Dump; dd $c;
    }
    Taisha:~/perl/forum $
    qui donne chez moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    Taisha:~/perl/forum $ perl ok88.pl live.xml
    {
      e => {
        "0"  => {
                  clt  => "-",
                  ha   => undef,
                  idpt => 0,
                  ja   => undef,
                  tn   => 0,
                  tnp  => undef,
                  tps  => "00:00:00",
                },
        "1"  => {
                  clt  => 6,
                  ha   => "19:14:57",
                  idpt => 1,
                  ja   => 5,
                  tn   => 1.2461111111111,
                  tnp  => 1.2461111111111,
                  tps  => "01:14:46",
                },
        "2"  => {
                  clt  => 8,
                  ha   => "19:49:19",
                  idpt => 2,
                  ja   => 5,
                  tn   => 1.8188888888889,
                  tnp  => 0.57277777777778,
                  tps  => "01:49:08",
                },
        "3"  => {
                  clt  => 4,
                  ha   => "20:47:46",
                  idpt => 3,
                  ja   => 5,
                  tn   => 2.7930555555556,
                  tnp  => 0.97416666666667,
                  tps  => "02:47:35",
                },
        "4"  => {
                  clt  => 2,
                  ha   => "21:44:50",
                  idpt => 4,
                  ja   => 5,
                  tn   => 3.7441666666667,
                  tnp  => 0.95111111111111,
                  tps  => "03:44:39",
                },
        "5"  => {
                  clt  => 3,
                  ha   => "22:44:19",
                  idpt => 5,
                  ja   => 5,
                  tn   => 4.7355555555556,
                  tnp  => 0.99138888888889,
                  tps  => "04:44:08",
                },
        "6"  => {
                  clt  => 4,
                  ha   => "23:13:08",
                  idpt => 6,
                  ja   => 5,
                  tn   => 5.2158333333333,
                  tnp  => 0.48027777777778,
                  tps  => "05:12:57",
                },
        "7"  => {
                  clt  => 1,
                  ha   => "00:37:37",
                  idpt => 7,
                  ja   => 6,
                  tn   => 6.6238888888889,
                  tnp  => 1.3755555555556,
                  tps  => "06:37:26",
                },
        "8"  => {
                  clt  => 1,
                  ha   => "01:30:04",
                  idpt => 8,
                  ja   => 6,
                  tn   => 7.4980555555556,
                  tnp  => 0.87416666666667,
                  tps  => "07:29:53",
                },
        "9"  => {
                  clt  => 1,
                  ha   => "02:10:10",
                  idpt => 9,
                  ja   => 6,
                  tn   => 8.1663888888889,
                  tnp  => 0.66833333333333,
                  tps  => "08:09:59",
                },
        "10" => {
                  clt  => 1,
                  ha   => "02:35:11",
                  idpt => 10,
                  ja   => 6,
                  tn   => 8.5833333333333,
                  tnp  => 0.41694444444444,
                  tps  => "08:35:00",
                },
        "11" => {
                  clt  => 1,
                  ha   => "03:00:37",
                  idpt => 11,
                  ja   => 6,
                  tn   => 9.0072222222222,
                  tnp  => 0.42388888888889,
                  tps  => "09:00:26",
                },
        "12" => {
                  clt  => 1,
                  ha   => "03:03:59",
                  idpt => 12,
                  ja   => 6,
                  tn   => 9.0633333333333,
                  tnp  => 0.056111111111111,
                  tps  => "09:03:48",
                },
        "14" => {
                  clt  => 1,
                  ha   => "03:58:55",
                  idpt => 14,
                  ja   => 6,
                  tn   => 9.9788888888889,
                  tnp  => 0.91555555555556,
                  tps  => "09:58:44",
                },
        "15" => {
                  clt  => 1,
                  ha   => "04:48:25",
                  idpt => 15,
                  ja   => 6,
                  tn   => 10.803888888889,
                  tnp  => 0.825,
                  tps  => "10:48:14",
                },
        "16" => {
                  clt  => 1,
                  ha   => "05:24:08",
                  idpt => 16,
                  ja   => 6,
                  tn   => 11.399166666667,
                  tnp  => 0.59527777777778,
                  tps  => "11:23:57",
                },
        "17" => {
                  clt  => 2,
                  ha   => "06:18:23",
                  idpt => 17,
                  ja   => 6,
                  tn   => 12.303333333333,
                  tnp  => 0.90416666666667,
                  tps  => "12:18:12",
                },
        "18" => {
                  clt  => 1,
                  ha   => "07:10:03",
                  idpt => 18,
                  ja   => 6,
                  tn   => 13.164444444444,
                  tnp  => 0.86111111111111,
                  tps  => "13:09:52",
                },
        "20" => {
                  clt  => 1,
                  ha   => "08:36:24",
                  idpt => 20,
                  ja   => 6,
                  tn   => 14.603611111111,
                  tnp  => 1.4191666666667,
                  tps  => "14:36:13",
                },
        "21" => {
                  clt  => 1,
                  ha   => "10:11:35",
                  idpt => 21,
                  ja   => 6,
                  tn   => 16.19,
                  tnp  => 1.5363888888889,
                  tps  => "16:11:24",
                },
        "23" => {
                  clt  => 1,
                  ha   => "10:38:27",
                  idpt => 23,
                  ja   => 6,
                  tn   => 16.637777777778,
                  tnp  => 0.44777777777778,
                  tps  => "16:38:16",
                },
        "24" => {
                  clt  => 1,
                  ha   => "11:43:42",
                  idpt => 24,
                  ja   => 6,
                  tn   => 17.725277777778,
                  tnp  => 1.0211111111111,
                  tps  => "17:43:31",
                },
        "25" => {
                  clt  => 1,
                  ha   => "12:17:13",
                  idpt => 25,
                  ja   => 6,
                  tn   => 18.283888888889,
                  tnp  => 0.55861111111111,
                  tps  => "18:17:02",
                },
        "28" => {
                  clt  => 1,
                  ha   => "13:56:10",
                  idpt => 28,
                  ja   => 6,
                  tn   => 19.933055555556,
                  tnp  => 1.5794444444444,
                  tps  => "19:55:59",
                },
        "91" => {
                  clt  => 1,
                  ha   => "14:26:54",
                  idpt => 91,
                  ja   => 6,
                  tn   => 20.445277777778,
                  tnp  => 0.51222222222222,
                  tps  => "20:26:43",
                },
        "94" => {
                  clt  => 1,
                  ha   => "15:09:26",
                  idpt => 94,
                  ja   => 6,
                  tn   => 21.154166666667,
                  tnp  => 0.70888888888889,
                  tps  => "21:09:15",
                },
      },
      identite => [{ nom => "THEVENARD", prenom => "Xavier", sx => "H" }],
      pt => {
        "0"  => {
                  a => 1036,
                  d => 0,
                  idpt => 0,
                  km => 0,
                  lat => 45.9237,
                  meet => 1,
                  n => "Chamonix",
                  nc => "Depart",
                  x => 50,
                  ylon => undef,
                },
        "1"  => {
                  a => 1739,
                  d => 870,
                  idpt => 1,
                  km => 13.56,
                  lat => 45.8792,
                  meet => undef,
                  n => "Le Delevret",
                  nc => "Delev",
                  x => 113,
                  ylon => undef,
                },
        "2"  => {
                  a => 815,
                  d => 959,
                  idpt => 2,
                  km => 20.83,
                  lat => 45.8934,
                  meet => 1,
                  n => "Saint Gervais",
                  nc => "StGer",
                  x => 147,
                  ylon => undef,
                },
        "3"  => {
                  a => 1160,
                  d => 1536,
                  idpt => 3,
                  km => 31.11,
                  lat => 45.8227,
                  meet => 1,
                  n => "Les Contamines",
                  nc => "Conta",
                  x => 195,
                  ylon => undef,
                },
        "4"  => {
                  a => 1699,
                  d => 2076,
                  idpt => 4,
                  km => 39.24,
                  lat => 45.7579,
                  meet => undef,
                  n => "La Balme",
                  nc => "Balme",
                  x => 232,
                  ylon => undef,
                },
        "5"  => {
                  a => 2441,
                  d => 2876,
                  idpt => 5,
                  km => 44.78,
                  lat => 45.7221,
                  meet => undef,
                  n => "Ref. Croix Bonhomme",
                  nc => "Bonhom",
                  x => 258,
                  ylon => undef,
                },
        "6"  => {
                  a => 1553,
                  d => 2876,
                  idpt => 6,
                  km => 50.06,
                  lat => 45.6965,
                  meet => 1,
                  n => "Les Chapieux",
                  nc => "Chapieu",
                  x => 283,
                  ylon => undef,
                },
        "7"  => {
                  a => 2507,
                  d => 3849,
                  idpt => 7,
                  km => 60.2,
                  lat => 45.7514,
                  meet => undef,
                  n => "Col de la Seigne",
                  nc => "Seigne",
                  x => 330,
                  ylon => undef,
                },
        "8"  => {
                  a => 1964,
                  d => 4107,
                  idpt => 8,
                  km => 66.72,
                  lat => 45.7705,
                  meet => undef,
                  n => "Lac Combal",
                  nc => "Combal",
                  x => 360,
                  ylon => undef,
                },
        "9"  => {
                  a => 2409,
                  d => 4570,
                  idpt => 9,
                  km => 70.57,
                  lat => 45.7723,
                  meet => undef,
                  n => "Arrete du Mont-Favre",
                  nc => "MtFavre",
                  x => 378,
                  ylon => undef,
                },
        "10" => {
                  a => 1958,
                  d => 4580,
                  idpt => 10,
                  km => 75.05,
                  lat => 45.7906,
                  meet => undef,
                  n => "Col Ch\xE9crouit",
                  nc => "Checrou",
                  x => 399,
                  ylon => undef,
                },
        "11" => {
                  a => 1191,
                  d => 4586,
                  idpt => 11,
                  km => 79.35,
                  lat => 45.7941,
                  meet => 1,
                  n => "Courmayeur - Dolonne Entr\xE9e",
                  nc => "Courm1",
                  x => 419,
                  ylon => undef,
                },
        "12" => {
                  a => 1191,
                  d => 4586,
                  idpt => 12,
                  km => 79.35,
                  lat => 45.7941,
                  meet => 1,
                  n => "Courmayeur - Dolonne Sortie",
                  nc => "Courm2",
                  x => 419,
                  ylon => undef,
                },
        "14" => {
                  a => 1977,
                  d => 5391,
                  idpt => 14,
                  km => 84.07,
                  lat => 45.8091,
                  meet => undef,
                  n => "Refuge Bertone",
                  nc => "Bertone",
                  x => 441,
                  ylon => undef,
                },
        "15" => {
                  a => 2015,
                  d => 5680,
                  idpt => 15,
                  km => 91.43,
                  lat => 45.8469,
                  meet => undef,
                  n => "Refuge Bonatti",
                  nc => "Bonatti",
                  x => 475,
                  ylon => undef,
                },
        "16" => {
                  a => 1772,
                  d => 5808,
                  idpt => 16,
                  km => 96.62,
                  lat => 45.8713,
                  meet => 1,
                  n => "Arnuva",
                  nc => "Arnuva",
                  x => 499,
                  ylon => undef,
                },
        "17" => {
                  a => 2527,
                  d => 6569,
                  idpt => 17,
                  km => 101.05,
                  lat => 45.8887,
                  meet => undef,
                  n => "Grand Col Ferret",
                  nc => "GdColF",
                  x => 520,
                  ylon => undef,
                },
        "18" => {
                  a => 1603,
                  d => 6704,
                  idpt => 18,
                  km => 111.04,
                  lat => 45.9357,
                  meet => 1,
                  n => "La Fouly",
                  nc => "Fouly",
                  x => 566,
                  ylon => undef,
                },
        "20" => {
                  a => 1482,
                  d => 7308,
                  idpt => 20,
                  km => 125.04,
                  lat => 46.0277,
                  meet => 1,
                  n => "Champex-Lac",
                  nc => "Champex",
                  x => 632,
                  ylon => undef,
                },
        "21" => {
                  a => 1883,
                  d => 8173,
                  idpt => 21,
                  km => 136.17,
                  lat => 46.0559,
                  meet => undef,
                  n => "La Giete",
                  nc => "Giete",
                  x => 683,
                  ylon => undef,
                },
        "23" => {
                  a => 1303,
                  d => 8231,
                  idpt => 23,
                  km => 140.95,
                  lat => 46.056,
                  meet => 1,
                  n => "Trient",
                  nc => "Trient",
                  x => 706,
                  ylon => undef,
                },
        "24" => {
                  a => 2005,
                  d => 9030,
                  idpt => 24,
                  km => 146.33,
                  lat => 46.0398,
                  meet => undef,
                  n => "Catogne",
                  nc => "Catogne",
                  x => 731,
                  ylon => undef,
                },
        "25" => {
                  a => 1263,
                  d => 9057,
                  idpt => 25,
                  km => 151.41,
                  lat => 46.0321,
                  meet => 1,
                  n => "Vallorcine",
                  nc => "Vallo",
                  x => 754,
                  ylon => undef,
                },
        "28" => {
                  a => 2116,
                  d => 9930,
                  idpt => 28,
                  km => 159.08,
                  lat => 45.9824,
                  meet => undef,
                  n => "La Tete aux vents",
                  nc => "TaVents",
                  x => 790,
                  ylon => undef,
                },
        "91" => {
                  a => 1871,
                  d => 9992,
                  idpt => 91,
                  km => 162.62,
                  lat => 45.9601,
                  meet => undef,
                  n => "La Flegere",
                  nc => "Flegere",
                  x => 806,
                  ylon => undef,
                },
        "94" => {
                  a => 1036,
                  d => 10083,
                  idpt => 94,
                  km => 169.86,
                  lat => 45.9236,
                  meet => 1,
                  n => "Chamonix",
                  nc => "Arrivee",
                  x => 840,
                  ylon => undef,
                },
      },
    }
    Taisha:~/perl/forum $
    il te suffit de remplacer l'appel final à dd par ta propre cuisine...
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  9. #9
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par cmcmc Voir le message
    tu peux capturer les infos que tu veux, puis une fois que tu as tout, générer ton résultat. Pour cela ajuste ci-dessous les entités et attributs désirés et remplace l'appel final à dd par ta propre cuisine.
    Merci infiniment de ton temps cmcmc, mais je t'avoue que je suis TRÈS LOIN d'avoir ton niveau, et j'ai vraiment du mal à adapter le code.
    - A quoi réfère @ARGV ? dois je le remplacer par le nom de mon xml ?
    - comment obtient tu le résultat de ton deuxième code cité ?
    - je ne comprends pas comment utiliser $c...
    - dd est une fonction ? Cela appelle à un autre fichier où je dois le coder à la suite

    Je me rends bien compte que ton code est HYPER optimisé, mais je nage complètement ...

    Encore désolé... Si tu peux me donner encore un petit coup de pouce ...

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bonjour à tous,

    @cmcmc
    1. Ne propose jamais aux débutants d'utiliser des expressions régulières pour analyser du XML, ce n'est jamais bien et c'est vraiment prendre de très mauvaises habitudes. Il faut les inciter à apprendre à utiliser un parseur XML ;
    2. Tes codes sont très performants mais difficile à lire pour un débutant, privilégions du code certes verbeux mais claires et surtout lisibles (pas trop compact).

  11. #11
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par djibril Voir le message
    @cmcmc
    1. Ne propose jamais aux débutants d'utiliser des expressions régulières pour analyser du XML, ce n'est jamais bien et c'est vraiment prendre de très mauvaises habitudes. Il faut les inciter à apprendre à utiliser un parseur XML ;
    2. Tes codes sont très performants mais difficile à lire pour un débutant, privilégions du code certes verbeux mais claires et surtout lisibles (pas trop compact).
    1) OK. Je ne le ferai plus

    2) C'est censé les inciter à réfléchir. Je montre un code opérationnel, preuve à l'appui. Ils peuvent ajouter des traces par-ci par-là pour comprendre comment ça marche. Le débutant en question est "Ingénieur développement logiciels" d'après son profil, il devrait être en mesure de chercher un peu dans la doc. Ce n'est pas à nous de faire son travail. Quand j'ai le temps j'essaie de détailler, si je n'ai pas le temps je montre un code dont il peut peut-être s'inspirer s'il y passe, lui, un peu de temps.
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  12. #12
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Mes excuses pour être aussi peu débrouillard.

    Par contre, je comprends votre agacement. Il y a du avoir un problème à la création de mon compte, je suis loin d'être "ingénieur développement logiciel"... il faut que je corrige ca de suite.
    J'ai fait des bases de JAVA en école d'ingénieur pendant 6 mois mais après NADA, et je travaille aujourd'hui dans un milieu qui n'a rien a voir avec le développement informatique.

    Ce petit script est d'ailleurs pour usage personnel.

    Mes excuses, je n'ai pas fait attention, je vais corriger cela de suite pour qu'il n'y ait pas de confusion.

    Encore merci

  13. #13
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par kenobiwan88 Voir le message
    Merci infiniment de ton temps cmcmc, mais je t'avoue que je suis TRÈS LOIN d'avoir ton niveau, et j'ai vraiment du mal à adapter le code.
    - A quoi réfère @ARGV ? dois je le remplacer par le nom de mon xml ?
    si tu cherchais un peu dans la doc ou sur google, tu verrais que @ARGV contient les paramètres passés au script. Dans la ligne de commande que je présente perl ok88.pl live.xml il n'y a qu'un paramètre, "live.xml". La liste @ARGV est donc une liste à un seul élément : ("live.xml"). L'affectation my ($filename) = @ARGV; initialise $filename au premier élement de la liste @ARGV.
    - comment obtient tu le résultat de ton deuxième code cité ?
    j'invoque perl avec le script ok88.pl et le paramètre live.xml où live.xml est un fichier dans le répertoire courant contenant les données complètes que tu as données précédemment.
    - je ne comprends pas comment utiliser $c...
    jette un coup d'oeil à la doc, notamment perldsc, perldata, perllol, perlref...

    A ce stade $c est une référence à un hash contenant trois clés : identité, e, et pt.

    la valeur pour identite est un tableau à un élément. Cet élément est un hashref contenant les attributs sélectionnés pour les entités de type 'identite', à savoir nom, prenom et sx.

    la valeur pour pt est un hashref, à raison d'une entrée par entité pt : la clé est l'idpt, et la valeur un hashref des attributs

    idem pour e.

    par exemple tu accèdes à l'attribut n du pt d'idpt 94 par $c->{pt}{94}{n}.

    identite est un tableau plutôt qu'un hash car il n'y a pas d'identifieur unique évident. Cette entité est probablement unique dans le fichier (il vaut mieux...). On accède au nom par
    $c->{identite}[0]{nom}
    - dd est une fonction ? Cela appelle à un autre fichier où je dois le coder à la suite
    dd est une fonction exportée par le module Data::Dump.

    Je me rends bien compte que ton code est HYPER optimisé, mais je nage complètement ...
    le code démontre entre choses que tu n'as pas besoin de parser plusieurs fois le fichier avec différents handlers. Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    XML::Twig->new(
    	twig_handlers => {
               ...
    	}) ->parsefile($filename);
    effectue tout le travail de parsing, pour les handlers définis dans ... .

    C'est là qu'il y a un peu de subtilité. le map va construire trois paires nom => handler. Tu l'auras peut-être deviné, les noms sont identite, pt et e. le handler est à chaque fois une fonction anonyme adéquate pour l'extraction et l'accumulation dans $c des attributs des différentes entités d'intérêt. Les paramètres passés au map sont de la forme ['e', 'idpt', [qw(idpt ha ja tps tn tnp clt)]] : le premier élément est le nom de l'entité, le deuxième un nom d'attribut pouvant servir d'index, et le troisième un tableau des noms d'attributs recherchés. Amuse toi à changer ces arguments et voir ce que cela donne...
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  14. #14
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Merci à toi, je vais continuer de tester ceci.
    Effectivement, en parrallèle j'avais compris les points @ARGV et le module Data:ump.

    Cependant, bien que j'arrive à accéder à quelques valeurs du hash (premiers test), il me sort une erreur

    use of uninitialized value $h{$idpt} in hash element at C:\...\ok88.pl
    Aurais tu une idée ?

    Je vais maintenant essayer de construire des boucles pour aller chercher un petit peu les valeurs qui m'interesse et les mettre en forme...

    encore merci de ton temps.

  15. #15
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par kenobiwan88 Voir le message
    Mes excuses pour être aussi peu débrouillard.

    Par contre, je comprends votre agacement. Il y a du avoir un problème à la création de mon compte, je suis loin d'être "ingénieur développement logiciel"... il faut que je corrige ca de suite.
    J'ai fait des bases de JAVA en école d'ingénieur pendant 6 mois mais après NADA, et je travaille aujourd'hui dans un milieu qui n'a rien a voir avec le développement informatique.

    Ce petit script est d'ailleurs pour usage personnel.

    Mes excuses, je n'ai pas fait attention, je vais corriger cela de suite pour qu'il n'y ait pas de confusion.

    Encore merci
    Okidoki

    Pas de soucis. Excuse moi s'il te plaît d'avoir été un peu abrupt. N'hésite pas à poser des questions. Je te promets d'essayer de trouver le temps de répondre, surtout si tu montres que tu as cherché aussi de ton côté. Tu es le bienvenu sur ce forum (et tu as fait le bon choix avec Perl ).
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  16. #16
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    use of uninitialized value $h{$idpt} in hash element at C:\...\ok88.pl
    montre le message complet et la ligne de code en question stp
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  17. #17
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Ne t'inquiète pas je ne l'ai pas mal pris.

    Alors, j'ai repris ton code que j'appelle avec le live.xml, comme indiqué précedemment.

    J'ai commencé à travailler sur l'affichage des données également (d'ailleurs je bosse sur foreach my keys pour remplacer mon compteur $i car le xml de base à la bonne idée d'avoir des "trous" dans la liste des idpt...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    #Taisha:~/perl/forum $ cat ok88.pl
    use strict;
    use warnings;
    use XML::Twig;
    my ($filename) = @ARGV;
    {
        my $c;
        XML::Twig->new(
                twig_handlers => {
                    map { my ($name, $id, $wanted_atts) = @$_;
                              $name => sub { my ($t, $e) = @_;
                                                   my %h = map { $_ => $e->att($_)} @$wanted_atts;
                                                   if ($id) {
                                                        $c->{$name}{$h{$id}} = \%h;
                                                   } else {
                                                        push @{$c->{$name}}, \%h;
                                                   }
                              } }
                    ['identite', undef, [qw(nom prenom sx)]],
                    ['e', 'idpt', [qw(idpt ha ja tps tn tnp clt)]],
                    ['pt', 'idpt', [qw(idpt n nc km d a x ylon lat meet)]]
                }) ->parsefile($filename);
       # use Data::Dump; dd $c;
     
                for (my $i = 1; $i <= 10; $i++) {
      print("\n$c->{pt}{$i}{n}\n");
                print("$c->{pt}{$i}{km}");
                print("\nAltitude $c->{pt}{$i}{a}m NGF");
                print("\n---------------");
    }
     
    }
    #Taisha:~/perl/forum $
    Je te remet le code complet.
    le message exact est donc, pour CE code la :

    Use of uninitialized value $h{"idpt"} in hash element at C:\...\CODE\WWW.pl line 17
    J'ai volontairement réduit le chemin C:\..., et WWW.pl est l'équivalent de ok88.pl pour toi.

    Cependant, cela n'empêche pas de m'afficher les "print".
    Et quand je décommente le use Data:ump il s'affiche également très bien je pense, mais toujours en me mettant cette erreur.

    A noter que cette erreur apparait 26fois sur la console.

    Comprends pas trop la...

    [edit : le code s'est décalé, sur mon notepad++ la ligne #Taisha:~/perl/forum $ cat ok88.pl est en ligne numéro 1]

  18. #18
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par kenobiwan88 Voir le message
    Use of uninitialized value $h{"idpt"} in hash element at C:\...\CODE\WWW.pl line 17
    bizarre... quelle version de perl utilises-tu (perl -v) ?

    essaie peut-être avec le programme suivant (outre un exemple d'impression, il y a une modif mineure du corps du map de génération des handlers).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Taisha:~/perl/forum $ cat ok88a.pl
    use strict;
    use warnings;
    use XML::Twig;
    use utf8;
     
    my ($filename) = @ARGV;
     
    {
        my $c;
     
        XML::Twig->new(
    	twig_handlers => {
    	    map { my ($name, $id, $wanted) = @$_; 
    		  my @wanted_atts = @$wanted;
    		  $name => sub { my ($t, $e) = @_;
    				 my %h = map { $_ => $e->att($_)} @wanted_atts;
    				 if ($id) {
    				     $c->{$name}{$h{$id}} = \%h;
    				 } else {
    				     push @{$c->{$name}}, \%h;
    				 }
    		  } }
    	    ['identite', undef, [qw(nom prenom sx)]],
    	    ['e', 'idpt', [qw(idpt ja ha jd hd)]],
    	    ['pt', 'idpt', [qw(idpt n)]]
    	}) ->parsefile($filename);
     
        print "Départ de $c->{pt}{0}{n} : $c->{e}{0}{jd} $c->{e}{0}{hd}\n";
        for (sort { $a <=> $b } keys %{$c->{e}}) {
    	next unless $_; 
    	my ($idpt, $ja, $ha) = @{$c->{e}{$_}}{qw(idpt ja ha)};
    	print "Arrivée à $c->{pt}{$idpt}{n} : $ja $ha\n";
        }
    }
    Taisha:~/perl/forum $
    Chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Taisha:~/perl/forum $ perl -COE ok88a.pl live.xml
    Départ de Chamonix : 5 18:00:11
    Arrivée à Le Delevret : 5 19:14:57
    Arrivée à Saint Gervais : 5 19:49:19
    Arrivée à Les Contamines : 5 20:47:46
    Arrivée à La Balme : 5 21:44:50
    Arrivée à Ref. Croix Bonhomme : 5 22:44:19
    Arrivée à Les Chapieux : 5 23:13:08
    Arrivée à Col de la Seigne : 6 00:37:37
    Arrivée à Lac Combal : 6 01:30:04
    Arrivée à Arrete du Mont-Favre : 6 02:10:10
    Arrivée à Col Chécrouit : 6 02:35:11
    Arrivée à Courmayeur - Dolonne Entrée : 6 03:00:37
    Arrivée à Courmayeur - Dolonne Sortie : 6 03:03:59
    Arrivée à Refuge Bertone : 6 03:58:55
    Arrivée à Refuge Bonatti : 6 04:48:25
    Arrivée à Arnuva : 6 05:24:08
    Arrivée à Grand Col Ferret : 6 06:18:23
    Arrivée à La Fouly : 6 07:10:03
    Arrivée à Champex-Lac : 6 08:36:24
    Arrivée à La Giete : 6 10:11:35
    Arrivée à Trient : 6 10:38:27
    Arrivée à Catogne : 6 11:43:42
    Arrivée à Vallorcine : 6 12:17:13
    Arrivée à La Tete aux vents : 6 13:56:10
    Arrivée à La Flegere : 6 14:26:54
    Arrivée à Chamonix : 6 15:09:26
    Taisha:~/perl/forum $
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  19. #19
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par cmcmc Voir le message
    @cmcmc

    1) Ne propose jamais aux débutants d'utiliser des expressions régulières pour analyser du XML, ce n'est jamais bien et c'est vraiment prendre de très mauvaises habitudes. Il faut les inciter à apprendre à utiliser un parseur XML ;
    2) Tes codes sont très performants mais difficile à lire pour un débutant, privilégions du code certes verbeux mais claires et surtout lisibles (pas trop compact).
    1) OK. Je ne le ferai plus

    2) C'est censé les inciter à réfléchir. Je montre un code opérationnel, preuve à l'appui. Ils peuvent ajouter des traces par-ci par-là pour comprendre comment ça marche. Le débutant en question est "Ingénieur développement logiciels" d'après son profil, il devrait être en mesure de chercher un peu dans la doc. Ce n'est pas à nous de faire son travail. Quand j'ai le temps j'essaie de détailler, si je n'ai pas le temps je montre un code dont il peut peut-être s'inspirer s'il y passe, lui, un peu de temps.
    J'apprécierai que la personne qui a moinssé ces prises de position ait l'obligeance de dire pourquoi.
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  20. #20
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    En fait après réflexion

    Citation Envoyé par cmcmc Voir le message
    Citation Envoyé par djibril Voir le message
    @cmcmc

    1) Ne propose jamais aux débutants d'utiliser des expressions régulières pour analyser du XML, ce n'est jamais bien et c'est vraiment prendre de très mauvaises habitudes. Il faut les inciter à apprendre à utiliser un parseur XML ;
    1) OK. Je ne le ferai plus
    Dans son message initial le demandeur cherche simplement à récupérer les valeurs de n, nc, km etc... pour chaque <pt> dans un fichier de données, certes XML, mais trivial : les données recherchées sont des attributs d'une entité sans enfant ni valeur, il n'y a pas de CDATA, pas d'accents, pas de pièges, rien. Franchement, avec cet énoncé, l'utilisation d'expressions régulières ne me paraît pas inappropriée. C'est comme ça que je ferais en production pour mon compte sur les données présentées. Je traite des gigaoctets de données XML en production avec des expressions régulières et ça se passe très bien, merci.

    Évidemment si on change le problème, en disant qu'on veut d'autres données, et qu'on présente le fichier complet, ça change la donne. Mais je conteste la sainte obligation a priori d'utiliser systématiquement un parser quand on doit traiter du XML. Je recommande, dans ce contexte comme en général, d'utiliser son cerveau pour choisir l'outil adapté.

    Tout ça pour dire que je ne m'interdis pas a priori de présenter dans le futur une solution à base d'expressions régulières si le contexte me paraît adapté.
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/08/2012, 13h47
  2. [XSLT] Changer la valeur d'un attribut XML
    Par Rouxy007 dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 14/02/2007, 23h06
  3. [Perl] comment installer XML sur Linux ?
    Par makohsarah dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 17/08/2006, 12h30
  4. [VB6]Lecture d'attributs XML
    Par BouB dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/05/2006, 16h01
  5. modifier la valeur d'un attribut xml
    Par totoche dans le forum ASP
    Réponses: 2
    Dernier message: 13/12/2005, 15h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo