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

Python Discussion :

Problème pour "parser" un fichier xml [Python 3.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    ça dépend
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ça dépend

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Problème pour "parser" un fichier xml
    Bonjour,

    Je galère avec xml.etree.ElementTree pour récupérer les données dont j'ai besoin.

    Voici le code que je teste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/python3
    # -*-coding:utf-8 -*
     
    import xml.etree.ElementTree as ET
     
    tree = ET.parse("fichier.xml")
    namespace = {"gpx": "http://www.topografix.com/GPX/1/1"} 
    for elem in tree.findall('gpx:trkpt', namespace):
        altitude = elem.find('ele')
        heure = elem.find('time')
        lat = elem.get('lat')
        lon = elem.get('lon')
        #print(lat, lon)
        print(lat, lon, heure, altitude)
    et le fichier que j'essaie de "parser"
    Code XML : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <gpx
      version="1.1"
      creator="Runkeeper - http://www.runkeeper.com"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://www.topografix.com/GPX/1/1"
      xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
      xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1">
      <name><![CDATA[Running 28/8/18 4:07 pm]]></name>
      <time>2018-08-28T16:07:08Z</time>
    <trkpt lat="48.801130000" lon="2.432096000"><ele>40.0</ele><time>2018-08-28T16:07:08Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>93</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.801182000" lon="2.432334000"><ele>40.0</ele><time>2018-08-28T16:07:18Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>101</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.801259000" lon="2.432525000"><ele>40.0</ele><time>2018-08-28T16:07:28Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>111</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.801390000" lon="2.432719000"><ele>40.9</ele><time>2018-08-28T16:07:38Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>124</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.801501000" lon="2.433018000"><ele>41.7</ele><time>2018-08-28T16:07:48Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>129</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.801564000" lon="2.433322000"><ele>42.8</ele><time>2018-08-28T16:07:58Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>130</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.801625000" lon="2.433611000"><ele>43.5</ele><time>2018-08-28T16:08:08Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>134</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.801701000" lon="2.433925000"><ele>44.0</ele><time>2018-08-28T16:08:18Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>135</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.801876000" lon="2.434104000"><ele>45.4</ele><time>2018-08-28T16:08:28Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>135</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.802111000" lon="2.434184000"><ele>45.4</ele><time>2018-08-28T16:08:38Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>136</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.802352000" lon="2.434208000"><ele>44.1</ele><time>2018-08-28T16:08:48Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>138</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.802568000" lon="2.434170000"><ele>42.5</ele><time>2018-08-28T16:08:58Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>140</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.802742000" lon="2.434340000"><ele>41.4</ele><time>2018-08-28T16:09:08Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>139</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.802849000" lon="2.434383000"><ele>41.0</ele><time>2018-08-28T16:09:18Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>139</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.802973000" lon="2.434583000"><ele>40.2</ele><time>2018-08-28T16:09:28Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>138</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.803103000" lon="2.434905000"><ele>39.6</ele><time>2018-08-28T16:09:38Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>136</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.803234000" lon="2.435194000"><ele>38.6</ele><time>2018-08-28T16:09:48Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>136</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.803377000" lon="2.435457000"><ele>38.5</ele><time>2018-08-28T16:09:58Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>138</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.803513000" lon="2.435729000"><ele>38.3</ele><time>2018-08-28T16:10:08Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>138</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.803662000" lon="2.435998000"><ele>38.0</ele><time>2018-08-28T16:10:18Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>142</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="48.803792000" lon="2.436322000"><ele>38.8</ele><time>2018-08-28T16:10:28Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>142</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    </gpx>

    Ce sont les lignes altitude = elem.find('ele') et heure = elem.find('time') qui me renvoient du "None" et si je code altitude = elem.find('ele').text j'obtiens un plantage.
    Je ne sais pas si c'est encore un problème de namespace ...
    Bref si quelqu'un a une idée pour que je puisse récupérer les valeurs en question

    Merci

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    'ele' et 'time' ne font pas partie directement de l’élément gpx, ce sont des enfants. On peut les obtenir comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        altitude = elem[0].text
        heure = elem[1].text
    Bon, ce qui m'ennuie ce sont les index qui obligent à garantir l'ordre... J'ai pas trouvé mieux pour le moment

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par xxxl76 Voir le message
    Je ne sais pas si c'est encore un problème de namespace ...
    C'est pas si compliqué de tester avec ou sans namespace...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Regarde si ceci peut t'aider: https://bazaar.launchpad.net/~vincen...geolocation.py

    Le parser de fichier gpx est définit à la ligne 523.

    Le code utilise plutôt xml.sax parce que les fichiers .gpx peuvent être particulièrement lourd. Il m'est arrivé d'en avoir qui étaient impossibles à charger en mémoire.

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import xml.etree.ElementTree as ET
     
    tree = ET.parse("fichier.xml")
    namespace = {"gpx": "http://www.topografix.com/GPX/1/1"}
     
    for elem in tree.findall('gpx:trkpt', namespace):
        lat = elem.get('lat')
        lon = elem.get('lon')
        altitude = elem.find('gpx:ele', namespace).text
        heure = elem.find('gpx:time', namespace).text
     
        print(lat, lon, heure, altitude)
    Ce qui renvoi :

    48.801130000 2.432096000 2018-08-28T16:07:08Z 40.0
    48.801182000 2.432334000 2018-08-28T16:07:18Z 40.0
    48.801259000 2.432525000 2018-08-28T16:07:28Z 40.0
    48.801390000 2.432719000 2018-08-28T16:07:38Z 40.9
    48.801501000 2.433018000 2018-08-28T16:07:48Z 41.7
    48.801564000 2.433322000 2018-08-28T16:07:58Z 42.8
    48.801625000 2.433611000 2018-08-28T16:08:08Z 43.5
    48.801701000 2.433925000 2018-08-28T16:08:18Z 44.0
    48.801876000 2.434104000 2018-08-28T16:08:28Z 45.4
    48.802111000 2.434184000 2018-08-28T16:08:38Z 45.4
    48.802352000 2.434208000 2018-08-28T16:08:48Z 44.1
    48.802568000 2.434170000 2018-08-28T16:08:58Z 42.5
    48.802742000 2.434340000 2018-08-28T16:09:08Z 41.4
    48.802849000 2.434383000 2018-08-28T16:09:18Z 41.0
    48.802973000 2.434583000 2018-08-28T16:09:28Z 40.2
    48.803103000 2.434905000 2018-08-28T16:09:38Z 39.6
    48.803234000 2.435194000 2018-08-28T16:09:48Z 38.6
    48.803377000 2.435457000 2018-08-28T16:09:58Z 38.5
    48.803513000 2.435729000 2018-08-28T16:10:08Z 38.3
    48.803662000 2.435998000 2018-08-28T16:10:18Z 38.0
    48.803792000 2.436322000 2018-08-28T16:10:28Z 38.8
    Voir ici : Parsing XML with Namespaces
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  6. #6
    Candidat au Club
    Homme Profil pro
    ça dépend
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ça dépend

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci à tous pour vos retours.
    La solution de Jerome est parfaite.
    J'avais testé un truc de ce genre mais sans trop comprendre (altitude = elem.find('trkpt:ele', namespace).text)

    J'ai vraiment du mal avec cette structure et le fonctionnement du parser, car ensuite pour récupérer les valeurs de la balise <gpxtpx:hr>, il faut lui donner tout le chemin ?
    J'ai essayé avec
    • elem.find('gpx:hr', namespace).text
    • elem.find('gpx:gpxtpx:hr', namespace).text
    • elem.find('gpx:extensions:gpxtpx:hr', namespace).text

    mais sans succès

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    altitude = elem.find('gpx:ele', namespace).text
    Rah ! Il me manquait le gpx:...

    Je !

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par xxxl76 Voir le message
    mais sans succès
    Comme ceci :


    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
    import xml.etree.ElementTree as ET
     
    tree = ET.parse("fichier.xml")
    namespaces = {"gpx": "http://www.topografix.com/GPX/1/1",
                  "gpxtpx": "http://www.garmin.com/xmlschemas/TrackPointExtension/v1"}
     
    for elem in tree.findall('gpx:trkpt', namespaces):
     
        lat = elem.get('lat')
        lon = elem.get('lon')
     
        altitude = elem.find('gpx:ele', namespaces).text
        heure = elem.find('gpx:time', namespaces).text
     
        for subelem in elem.find('gpx:extensions', namespaces):
            hr = subelem.find('gpxtpx:hr', namespaces).text
     
        print(lat, lon, heure, altitude, hr)
    Ce qui renvoi :
    48.801130000 2.432096000 2018-08-28T16:07:08Z 40.0 93
    48.801182000 2.432334000 2018-08-28T16:07:18Z 40.0 101
    48.801259000 2.432525000 2018-08-28T16:07:28Z 40.0 111
    48.801390000 2.432719000 2018-08-28T16:07:38Z 40.9 124
    48.801501000 2.433018000 2018-08-28T16:07:48Z 41.7 129
    48.801564000 2.433322000 2018-08-28T16:07:58Z 42.8 130
    48.801625000 2.433611000 2018-08-28T16:08:08Z 43.5 134
    48.801701000 2.433925000 2018-08-28T16:08:18Z 44.0 135
    48.801876000 2.434104000 2018-08-28T16:08:28Z 45.4 135
    48.802111000 2.434184000 2018-08-28T16:08:38Z 45.4 136
    48.802352000 2.434208000 2018-08-28T16:08:48Z 44.1 138
    48.802568000 2.434170000 2018-08-28T16:08:58Z 42.5 140
    48.802742000 2.434340000 2018-08-28T16:09:08Z 41.4 139
    48.802849000 2.434383000 2018-08-28T16:09:18Z 41.0 139
    48.802973000 2.434583000 2018-08-28T16:09:28Z 40.2 138
    48.803103000 2.434905000 2018-08-28T16:09:38Z 39.6 136
    48.803234000 2.435194000 2018-08-28T16:09:48Z 38.6 136
    48.803377000 2.435457000 2018-08-28T16:09:58Z 38.5 138
    48.803513000 2.435729000 2018-08-28T16:10:08Z 38.3 138
    48.803662000 2.435998000 2018-08-28T16:10:18Z 38.0 142
    48.803792000 2.436322000 2018-08-28T16:10:28Z 38.8 142
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Candidat au Club
    Homme Profil pro
    ça dépend
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ça dépend

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup Jérôme pour ton aide
    C'est pas le genre de solution que l'on trouve par hasard.

  10. #10
    Candidat au Club
    Homme Profil pro
    ça dépend
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ça dépend

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Peux tu m'expliquer à quoi sert la ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ext = elem.find('gpx:extensions', namespaces)

  11. #11
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par xxxl76 Voir le message
    Peux tu m'expliquer à quoi sert la ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ext = elem.find('gpx:extensions', namespaces)
    À rien… c'était pour voir si tu suivais
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  12. #12
    Candidat au Club
    Homme Profil pro
    ça dépend
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ça dépend

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Me revoilà.
    En fait je croyais pouvoir venir à bout de mon programme avec les éléments que j'avais mais ce fichier xml est trop fort pour moi.
    Donc, j'avais un peu simplifié le fichier de départ, mais du coup si je reprends la vraie structure du fichier, je n'arrive pas à nouveau pas à le parser.
    J'ai voulu appliquer la même méthode que pour récupérer le rythme cardiaque pour gérer cette arborescence supplémentaire mais sans succès.

    Voici la vraie structure du fichier

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <gpx
      version="1.1"
      creator="Runkeeper - http://www.runkeeper.com"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://www.topografix.com/GPX/1/1"
      xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
      xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1">
    <trk>
      <name><![CDATA[Running 21/8/18 5:17 pm]]></name>
      <time>2018-08-21T17:17:34Z</time>
    <trkseg>
    <trkpt lat="35.332348000" lon="25.298450000"><ele>4.7</ele><time>2018-08-21T17:17:34Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>93</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332364000" lon="25.298455000"><ele>4.6</ele><time>2018-08-21T17:17:35Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>94</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332381000" lon="25.298462000"><ele>4.5</ele><time>2018-08-21T17:17:36Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>96</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332399000" lon="25.298471000"><ele>4.4</ele><time>2018-08-21T17:17:37Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>97</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332417000" lon="25.298482000"><ele>4.4</ele><time>2018-08-21T17:17:38Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>97</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332436000" lon="25.298494000"><ele>4.4</ele><time>2018-08-21T17:17:39Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>95</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332456000" lon="25.298508000"><ele>4.3</ele><time>2018-08-21T17:17:40Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>96</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332476000" lon="25.298524000"><ele>4.2</ele><time>2018-08-21T17:17:41Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>97</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332496000" lon="25.298540000"><ele>4.1</ele><time>2018-08-21T17:17:42Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>98</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332517000" lon="25.298557000"><ele>4.0</ele><time>2018-08-21T17:17:43Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>99</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332538000" lon="25.298576000"><ele>4.0</ele><time>2018-08-21T17:17:44Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>101</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332559000" lon="25.298594000"><ele>4.0</ele><time>2018-08-21T17:17:45Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>102</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332580000" lon="25.298614000"><ele>4.0</ele><time>2018-08-21T17:17:46Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>102</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332602000" lon="25.298633000"><ele>4.0</ele><time>2018-08-21T17:17:47Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>104</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332623000" lon="25.298653000"><ele>4.0</ele><time>2018-08-21T17:17:48Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>104</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332644000" lon="25.298672000"><ele>4.0</ele><time>2018-08-21T17:17:49Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>105</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    <trkpt lat="35.332665000" lon="25.298692000"><ele>4.0</ele><time>2018-08-21T17:17:50Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:hr>106</gpxtpx:hr></gpxtpx:TrackPointExtension></extensions></trkpt>
    </trkseg>
    </trk>
    </gpx>
    Et en partant de ce code, je n'arrive pas à faire fonctionner le script quand les balises <trk> et <trkseg> sont présentes
    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
    import xml.etree.ElementTree as ET
     
    tree = ET.parse("fichier.xml")
    namespaces = {"gpx": "http://www.topografix.com/GPX/1/1",
                  "gpxtpx": "http://www.garmin.com/xmlschemas/TrackPointExtension/v1"}
     
    for elem in tree.findall('gpx:trkpt', namespaces):
     
        lat = elem.get('lat')
        lon = elem.get('lon')
     
        altitude = elem.find('gpx:ele', namespaces).text
        heure = elem.find('gpx:time', namespaces).text
     
        for subelem in elem.find('gpx:extensions', namespaces):
            hr = subelem.find('gpxtpx:hr', namespaces).text
     
        print(lat, lon, heure, altitude, hr)

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par xxxl76 Voir le message
    Et en partant de ce code, je n'arrive pas à faire fonctionner le script quand les balises <trk> et <trkseg> sont présentes
    Relisez la documentation: findall ne cherche que dans les enfants directs du noeud.
    Si vous voulez aller récupérer les noeuds qui commencent par trkpt beaucoup plus bas, il faut parcourir l'arbre à la main ou utiliser une expression XPath dur genre: tree.findall('.//gpx:trkpt', ns).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    utiliser une expression XPath dur genre: tree.findall('.//gpx:trkpt', ns)
    Ou en conservant les groupements parents/enfants :
    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
    import xml.etree.ElementTree as ET
     
    tree = ET.parse("fichier.xml")
    namespaces = {"gpx": "http://www.topografix.com/GPX/1/1",
                  "gpxtpx": "http://www.garmin.com/xmlschemas/TrackPointExtension/v1"}
     
    for trk in tree.findall('gpx:trk', namespaces):
     
        for trkseg in trk.findall('gpx:trkseg', namespaces):
     
            for trkpt in trkseg.findall('gpx:trkpt', namespaces):
     
                lat = trkpt.get('lat')
                lon = trkpt.get('lon')
     
                altitude = trkpt.find('gpx:ele', namespaces).text
                heure = trkpt.find('gpx:time', namespaces).text
     
                for extensions in trkpt.find('gpx:extensions', namespaces):
                    hr = extensions.find('gpxtpx:hr', namespaces).text
     
                print(lat, lon, heure, altitude, hr)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  15. #15
    Candidat au Club
    Homme Profil pro
    ça dépend
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ça dépend

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos retours

    J'ai essayé hier avec la méthode de Wiztricks, ça fonctionne, mais ça a des impacts dans l'algo du programme, et j'ai pas encore tout analysé, mais certains fichiers ne passent plus alors qu'ils ne semblent pas avoir une structure différente.

    Je vais essayer aujourd'hui si j'ai le temps la méthode de Jérôme et je vous tiens au courant. (je suis curieux car j'avais essayé un truc dans ce genre)

    A suivre ...

  16. #16
    Candidat au Club
    Homme Profil pro
    ça dépend
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ça dépend

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    C'est parfait !!!

    C'est exactement e que je voulais.
    J'ai pu finir mon programme sans modifier l'architecture.

    Maintenant étape suivante, création de courbes de tendance avec MatPlotLib

    Merci de votre aide

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

Discussions similaires

  1. Problème pour créer des routines génèrent fichier XML sur Talend à partir d'un CSV
    Par SkalpaINRA dans le forum Forum général Solutions d'entreprise
    Réponses: 0
    Dernier message: 11/10/2016, 10h46
  2. Problème pour supprimer attribut dans un fichier XML
    Par Jb_One73 dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 19/02/2015, 10h08
  3. Problème pour l'ouverture d'un fichier XML
    Par Kutoh dans le forum Powerpoint
    Réponses: 5
    Dernier message: 31/07/2013, 17h49

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