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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du 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
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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 confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    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 317
    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 317
    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

  6. #6
    Nouveau membre du 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
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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 317
    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 317
    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

  9. #9
    Nouveau membre du 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
    Par défaut
    Merci beaucoup Jérôme pour ton aide
    C'est pas le genre de solution que l'on trouve par hasard.

+ 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