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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 chevronné 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
    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.

  3. #3
    Membre averti
    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
    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
    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 averti
    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
    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 !

  6. #6
    Membre averti
    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
    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...]

  7. #7
    Membre chevronné 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
    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
        ...
      }
    }

+ Répondre à la discussion
Cette discussion est résolue.

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