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 parsing avec minidom [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 19
    Par défaut Problème parsing avec minidom
    Bonjour,

    J'ai créé un bout de programme qui permet de lire un fichier SML de Suunto (c'est en fait un fichier xml qui comporte des données GPS et mesures cardiaques lors de running).

    Mon parser fonctionne pas mal mais j'ai des objets erronés qui apparaissent dans l'objet miniDOM :

    Nom : Capture1.JPG
Affichages : 295
Taille : 19,3 Ko

    Des "whitespace" type \n ou \t apparaissent en tant qu'objet miniDOM alors qu'ils n’existent pas. Ci-dessous la lecture d'un fichier SML avec un lecteur de fichier XML :

    Nom : Capture2.JPG
Affichages : 310
Taille : 40,5 Ko

    Le problème est que ces "faux" nœuds me causent des problèmes lorsque je veux adresser un nœuds avec des ChilNodes[x]. En effet, le numéro "x" est forcément faux.
    J'ai essayé d'ajouter une fonction du type "cleandom" dans mon code. Même si cela permet effectivement de nettoyer les "faux" nœuds, cela me cause d'autres problèmes dans l'arbre DOM. Cette fonction doit me correspondre une partie du fichier XML.

    Avez-vous une solution pour rendre propre l'arbre DOM ? Càd ne plus avoir ces nœuds fantômes ?

    Merci d'avance.

    rmarion37

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 19
    Par défaut
    Personne pour un petit coup de main ?

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Citation Envoyé par rmarion37 Voir le message
    Personne pour un petit coup de main ?
    Vous ne postez ni le code, ni le fichier XML,... à partir de là, pas facile d'imaginer d'où vient le problème.... Sauf à vous rappeler ce que raconte la documentation du module minidom: "Users who are not already proficient with the DOM should consider using the xml.etree.ElementTree module for their XML processing instead".

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

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 19
    Par défaut
    Bonjour,

    Ci-dessous le bout de code pour parser le fichier sml (de type xml). Un peu de compréhension, je commence juste la programmation Python :

    # -*- coding: utf-8 -*-
    """
    Created on Mon Oct 10 10:54:20 2016

    @author: 801333
    """

    import matplotlib.pyplot as plt
    import pandas
    import math
    import numpy as numpy

    from xml.dom import minidom
    from mpl_toolkits.mplot3d import Axes3D

    colonnes = ["time","latitude","longitude", "distance", "speed", "altitude", "gpsaltitude", "heartrate","energy","temperature"]
    lignes = []

    #Fonction parser Samples du SML
    #Latitude et longitude en degrés.
    #Vitesse en km/h
    #Fréquence cardiaque en bpm

    def parseSamples(Samples):
    " Fonction parsing du fichier SML"
    for Sample in Samples.getElementsByTagName('Sample'):

    time = Sample.getElementsByTagName('UTC')[0].firstChild.data

    if (len(Sample.getElementsByTagName('Latitude'))!=0):
    try:
    latitude = math.degrees(float(Sample.getElementsByTagName('Latitude')[0].firstChild.data))
    except ValueError:
    latitude = None
    else:
    latitude = None

    if (len(Sample.getElementsByTagName('Longitude'))!=0):
    try:
    longitude = math.degrees(float(Sample.getElementsByTagName('Longitude')[0].firstChild.data))
    except ValueError:
    longitude = None
    else:
    longitude = None

    if (len(Sample.getElementsByTagName('Distance'))!=0):
    try:
    distance = int(Sample.getElementsByTagName('Distance')[0].firstChild.data)
    except ValueError:
    distance = None
    else:
    distance = None

    if (len(Sample.getElementsByTagName('Speed'))!=0):
    try:
    speed = float((Sample.getElementsByTagName('Speed')[0].firstChild.data)) * 3.6
    except ValueError:
    speed = None
    else:
    speed = None

    if (len(Sample.getElementsByTagName('Altitude'))!=0):
    try:
    altitude = int(Sample.getElementsByTagName('Altitude')[0].firstChild.data)
    except ValueError:
    altitude = None
    else:
    altitude = None

    if (len(Sample.getElementsByTagName('GPSAltitude'))!=0):
    try:
    gpsaltitude = float(Sample.getElementsByTagName('GPSAltitude')[0].firstChild.data)
    except ValueError:
    gpsaltitude = None
    else:
    gpsaltitude = None


    if (len(Sample.getElementsByTagName('HR'))!=0):
    try:
    heartrate = float((Sample.getElementsByTagName('HR')[0].firstChild.data)) * 60 + 0.5
    except ValueError:
    heartrate = None
    else:
    heartrate = None

    if (len(Sample.getElementsByTagName('EnergyConsumption'))!=0):
    try:
    energy = float(Sample.getElementsByTagName('EnergyConsumption')[0].firstChild.data)
    except ValueError:
    energy = None
    else:
    energy = None

    if (len(Sample.getElementsByTagName('Temperature'))!=0):
    try:
    temperature = float(Sample.getElementsByTagName('Temperature')[0].firstChild.data)-273
    except ValueError:
    temperature = None
    else:
    temperature = None

    ligne = (time, latitude, longitude, distance, speed, altitude, gpsaltitude, heartrate, energy, temperature)
    lignes.append(ligne)

    #Programme principal#

    #Parser minidom
    #Fichier 100km de Millau
    doc = minidom.parse('D9F698461C000D00-2016-09-24T09_59_45-0.sml')

    sml = doc.documentElement

    #Parsing du fichier GPX chargé dans doc (gpx = doc.documentElement)
    for node in sml.getElementsByTagName('Samples'):
    parseSamples(node)

    #Création d'un Dataframe Pandas avec le fichier parsé par minidom
    #Interpolation linéaire des données manquantes avec interpolate()
    #Les premières données manquantes sont recopiées en prenant les premières valides avec fillna()
    df = pandas.DataFrame(data = lignes, columns = colonnes)
    df = df.interpolate(axis = 0).fillna(method='backfill')

    #On passe en "entier" les données qui peuvent être simplifiées
    #Les données en "float" sont arrondis à 2 décimales
    df['distance'] = df['distance'].astype(int)
    df["speed"] = df["speed"].round(2)
    df['altitude'] = df['altitude'].astype(int)
    df['gpsaltitude'] = df['gpsaltitude'].astype(int)
    df['heartrate'] = df['heartrate'].astype(int)
    df["energy"] = df["energy"].round(2)
    df["temperature"] = df["temperature"].round(2)

    #Sauvegarde du dataframe
    #df.to_csv('Extract.csv', sep = '\t')

    altitudebaro = numpy.mean(df['altitude'])
    altitudegps = numpy.mean(df['gpsaltitude'])
    df['altitude'] = df['altitude']+int(altitudegps-altitudebaro)

    #Graph en 3D du chemin
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.plot(df['longitude'], df['latitude'], df['altitude'])
    ax.plot(df['longitude'], df['latitude'], df['gpsaltitude'])

    #Graphs divers
    fig = plt.figure()
    plt.plot(df['longitude'],df["latitude"])

    fig = plt.figure()
    plt.plot(df["altitude"])
    plt.plot(df["gpsaltitude"])

    fig = plt.figure()
    plt.plot(df["speed"])
    fig = plt.figure()
    plt.plot(df['heartrate'])




    Je joins aussi le fichier .sml qui comporte toutes les données brutes enregistrées par la montre.
    Avec ce code, je récupère les données (longitude, latitude, ....) dans un dataframe et lorsqu'une donnée est absente ou erronée, je la remplace par un NaN. Les données manquantes sont ensuite extrapoler pour tous les noeuds.

    Par contre, comme expliqué dans mon message initial, l'arbre est pollué par des \n\t et cela me cause des problèmes pour navuguer dans l'arbre.

    Merci d'avance.

    rmarion37

  5. #5
    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,

    Il faut mettre ton code entre des balises [code], sans l'indentation ce n'est pas compréhensible.

    Tu as oublié le fichier en pièce jointe.

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 19
    Par défaut
    Toutes mes excuses :

    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
    # -*- coding: utf-8 -*-
    """
    Created on Mon Oct 10 10:54:20 2016
     
    @author: 801333
    """
     
    import matplotlib.pyplot as plt
    import pandas
    import math
    import numpy as numpy
     
    from xml.dom import minidom
    from mpl_toolkits.mplot3d import Axes3D
     
    colonnes = ["time","latitude","longitude", "distance", "speed", "altitude", "gpsaltitude", "heartrate","energy","temperature"]
    lignes = []
     
    #Fonction parser Samples du SML
    #Latitude et longitude en degrés.
    #Vitesse en km/h
    #Fréquence cardiaque en bpm
     
    def parseSamples(Samples):
        " Fonction parsing du fichier SML"
        for Sample in Samples.getElementsByTagName('Sample'):
     
            time = Sample.getElementsByTagName('UTC')[0].firstChild.data
     
            if (len(Sample.getElementsByTagName('Latitude'))!=0): 
                try:
                    latitude = math.degrees(float(Sample.getElementsByTagName('Latitude')[0].firstChild.data))
                except ValueError:
                    latitude = None 
            else:
                latitude = None
     
            if (len(Sample.getElementsByTagName('Longitude'))!=0):
                try:
                    longitude = math.degrees(float(Sample.getElementsByTagName('Longitude')[0].firstChild.data))
                except ValueError:
                    longitude = None             
            else:
                longitude = None
     
            if (len(Sample.getElementsByTagName('Distance'))!=0):
                try:
                    distance = int(Sample.getElementsByTagName('Distance')[0].firstChild.data)
                except ValueError:
                    distance = None                
            else:
                distance = None
     
            if (len(Sample.getElementsByTagName('Speed'))!=0):
                try:
                    speed = float((Sample.getElementsByTagName('Speed')[0].firstChild.data)) * 3.6
                except ValueError:
                    speed = None                
            else:
                speed = None           
     
            if (len(Sample.getElementsByTagName('Altitude'))!=0):
                try:
                    altitude = int(Sample.getElementsByTagName('Altitude')[0].firstChild.data)
                except ValueError:
                    altitude = None 
            else:
                altitude = None
     
            if (len(Sample.getElementsByTagName('GPSAltitude'))!=0):
                try:
                    gpsaltitude = float(Sample.getElementsByTagName('GPSAltitude')[0].firstChild.data)
                except ValueError:
                    gpsaltitude = None 
            else:
                gpsaltitude = None           
     
     
            if (len(Sample.getElementsByTagName('HR'))!=0):
                try:
                    heartrate = float((Sample.getElementsByTagName('HR')[0].firstChild.data)) * 60 + 0.5
                except ValueError:
                    heartrate = None
            else:
                heartrate = None
     
            if (len(Sample.getElementsByTagName('EnergyConsumption'))!=0):
                try:
                    energy = float(Sample.getElementsByTagName('EnergyConsumption')[0].firstChild.data)
                except ValueError:
                    energy = None 
            else:
                energy = None
     
            if (len(Sample.getElementsByTagName('Temperature'))!=0):
                try:
                    temperature = float(Sample.getElementsByTagName('Temperature')[0].firstChild.data)-273
                except ValueError:
                    temperature = None 
            else:
                temperature = None
     
            ligne = (time, latitude, longitude, distance, speed, altitude, gpsaltitude, heartrate, energy, temperature)                
            lignes.append(ligne)
     
    #Programme principal#
     
    #Parser minidom
    doc = minidom.parse('D9F698461C000D00-2016-09-20T11_57_28-0.sml')
     
    sml = doc.documentElement
     
    #Parsing du fichier GPX chargé dans doc (gpx = doc.documentElement)
    for node in sml.getElementsByTagName('Samples'):
        parseSamples(node)
     
    #Création d'un Dataframe Pandas avec le fichier parsé par minidom
    #Interpolation linéaire des données manquantes avec interpolate()
    #Les premières données manquantes sont recopiées en prenant les premières valides avec fillna()
    df = pandas.DataFrame(data = lignes, columns = colonnes)
    df = df.interpolate(axis = 0).fillna(method='backfill')
     
    #On passe en "entier" les données qui peuvent être simplifiées
    #Les données en "float" sont arrondis à 2 décimales
    df['distance'] = df['distance'].astype(int)
    df["speed"] = df["speed"].round(2)
    df['altitude'] = df['altitude'].astype(int)
    df['gpsaltitude'] = df['gpsaltitude'].astype(int)
    df['heartrate'] = df['heartrate'].astype(int)
    df["energy"] = df["energy"].round(2)
    df["temperature"] = df["temperature"].round(2)
     
    #Sauvegarde du dataframe
    #df.to_csv('Extract.csv', sep = '\t')
     
    #Calcul de la moyenne des altitudes baro et GPS
    #L'atitude baro (plus stable) est recalée sur la moyenne GPS par offset
    altitudebaro = numpy.mean(df['altitude'])
    altitudegps = numpy.mean(df['gpsaltitude'])
    #df['altitude'] = df['altitude']+int(altitudegps-altitudebaro)
     
    #Graph en 3D du chemin
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.plot(df['longitude'], df['latitude'], df['altitude'])
    ax.plot(df['longitude'], df['latitude'], df['gpsaltitude'])
     
    #Graphs divers
    fig = plt.figure()
    plt.plot(df['longitude'],df["latitude"])
     
    fig = plt.figure()
    plt.plot(df["altitude"])
    plt.plot(df["gpsaltitude"])
     
    fig = plt.figure()
    plt.plot(df["speed"])
     
    fig = plt.figure()
    plt.plot(df['heartrate'])
    Et voilà.

    Impossible de joindre mo fichier SML. J'ai une erruer qui apparait. Je ré-essaierai dans quelques minutes.

    Avec ce code, je récupère les données (longitude, latitude, ....) dans un dataframe et lorsqu'une donnée est absente ou erronée, je la remplace par un NaN. Les données manquantes sont ensuite extrapolées pour tous les nœuds.

    Par contre, comme expliqué dans mon message initial, l'arbre est pollué par des \n\t et cela me cause des soucis pour naviguer dans l'arbre.

    Merci d'avance.

    rmarion37

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 19
    Par défaut
    Je viens encore d'essayer d'uploader le fichier sml: "une erreur est survenues".

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Citation Envoyé par rmarion37 Voir le message
    Je viens encore d'essayer d'uploader le fichier sml: "une erreur est survenues".
    Quelle est la taille du fichier que vous voulez charger? Sinon, un petit fichier avec des exemples d'enregistrements à problème suffit.

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

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 19
    Par défaut
    J'ai zippé le fichier pour réduire la taille. C'était bien un problème de taille.

    D9F698461C000D00-2016-09-20T11_57_28-0.zip

    Ci-dessous un extrait du fichier. J'ai réduis le nombre de "Sample" (<Sample></Sample>) mais l'idée est là.

    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
    <?xml version="1.0" encoding="utf-8"?>
    <sml SdkVersion="2.4.89" Modified="2012-09-22T10:39:51" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.suunto.com/schemas/sml">
    	<DeviceLog>
    		<Header>
    			<Duration>2630.1000000000004</Duration>
    			<Ascent>13</Ascent>
    			<Descent>12</Descent>
    			<AscentTime>461</AscentTime>
    			<DescentTime>250</DescentTime>
    			<RecoveryTime>189000</RecoveryTime>
    			<Speed>
    				<Avg>2.6111111111111112</Avg>
    				<Max>3.4694444444444446</Max>
    				<MaxTime>1399.3209999999999</MaxTime>
    			</Speed>
    			<Cadence>
    				<MaxTime>0</MaxTime>
    			</Cadence>
    			<Altitude>
    				<Max>-6</Max>
    				<Min>-14</Min>
    				<MaxTime>85.710999999999999</MaxTime>
    				<MinTime>540.66300000000001</MinTime>
    			</Altitude>
    			<HR>
    				<Avg>1.8999999999999999</Avg>
    				<Max>2.1499999999999999</Max>
    				<Min>1.0833333333333333</Min>
    				<MaxTime>1918.7550000000001</MaxTime>
    				<MinTime>7.6980000000000004</MinTime>
    			</HR>
    			<PeakTrainingEffect>1.9000000000000001</PeakTrainingEffect>
    			<ActivityType>3</ActivityType>
    			<Activity>Course</Activity>
    			<Temperature>
    				<Max>301.25</Max>
    				<Min>296.34999999999997</Min>
    				<MaxTime>0</MaxTime>
    				<MinTime>2580.6790000000001</MinTime>
    			</Temperature>
    			<Distance>6870</Distance>
    			<LogItemCount>5248</LogItemCount>
    			<Energy>1457006.4000000001</Energy>
    			<TimeToFirstFix>0</TimeToFirstFix>
    			<BatteryChargeAtStart>0</BatteryChargeAtStart>
    			<BatteryCharge>0</BatteryCharge>
    			<DistanceBeforeCalibrationChange>0</DistanceBeforeCalibrationChange>
    			<DateTime>2016-09-20T11:57:28</DateTime>
    		</Header>
    		<Device>
    			<Name>Suunto Ambit</Name>
    			<SerialNumber>D9F698461C000D00</SerialNumber>
    			<Info>
    				<SW>2.5.7</SW>
    				<HW>69.1.18948</HW>
    				<BSL>1.4.3</BSL>
    			</Info>
    		</Device>
    		<Samples>
    			<Sample>
    				<UTC>2016-09-20T09:57:28.690Z</UTC>
    				<Time>0</Time>
    				<Events>
    					<Pause>
    						<Type>31</Type>
    						<Duration>0</Duration>
    						<Distance>0</Distance>
    						<State>False</State>
    					</Pause>
    				</Events>
    			</Sample>
    			<Sample>
    				<VerticalSpeed>0</VerticalSpeed>
    				<EnergyConsumption>83.73599999999999</EnergyConsumption>
    				<Temperature>300.54999999999995</Temperature>
    				<SeaLevelPressure>101280</SeaLevelPressure>
    				<Altitude>-12</Altitude>
    				<Distance>0</Distance>
    				<Speed>0.52000000000000002</Speed>
    				<Time>0.001</Time>
    				<SampleType>periodic</SampleType>
    				<UTC>2016-09-20T09:57:28.691Z</UTC>
    			</Sample>
    			<Sample>
    				<NavType>0x0204</NavType>
    				<NavValid>validated</NavValid>
    				<NavTypeExplanation>4 or more SV KF solution, overdetermined</NavTypeExplanation>
    				<Satellites>
    					<Satellite>
    						<SV>20</SV>
    						<SNR>26</SNR>
    						<CodeLocked>true</CodeLocked>
    						<Ephemeris>false</Ephemeris>
    						<Custom>State 0x2d</Custom>
    					</Satellite>
    					<Satellite>
    						<SV>21</SV>
    						<SNR>25</SNR>
    						<CodeLocked>true</CodeLocked>
    						<Ephemeris>true</Ephemeris>
    						<Custom>State 0xad</Custom>
    					</Satellite>
    					<Satellite>
    						<SV>18</SV>
    						<SNR>24</SNR>
    						<CodeLocked>true</CodeLocked>
    						<Ephemeris>true</Ephemeris>
    						<Custom>State 0xad</Custom>
    					</Satellite>
    					<Satellite>
    						<SV>10</SV>
    						<SNR>4</SNR>
    						<CodeLocked>true</CodeLocked>
    						<Ephemeris>true</Ephemeris>
    						<Custom>State 0xad</Custom>
    					</Satellite>
    					<Satellite>
    						<SV>27</SV>
    						<SNR>42</SNR>
    						<CodeLocked>true</CodeLocked>
    						<Ephemeris>true</Ephemeris>
    						<Custom>State 0xbf</Custom>
    					</Satellite>
    					<Satellite>
    						<SV>8</SV>
    						<SNR>29</SNR>
    						<CodeLocked>true</CodeLocked>
    						<Ephemeris>true</Ephemeris>
    						<Custom>State 0xbf</Custom>
    					</Satellite>
    					<Satellite>
    						<SV>26</SV>
    						<SNR>22</SNR>
    						<CodeLocked>true</CodeLocked>
    						<Ephemeris>true</Ephemeris>
    						<Custom>State 0xad</Custom>
    					</Satellite>
    					<Satellite>
    						<SV>7</SV>
    						<SNR>26</SNR>
    						<CodeLocked>true</CodeLocked>
    						<Ephemeris>true</Ephemeris>
    						<Custom>State 0xbd</Custom>
    					</Satellite>
    					<Satellite>
    						<SV>16</SV>
    						<SNR>30</SNR>
    						<CodeLocked>true</CodeLocked>
    						<Ephemeris>true</Ephemeris>
    						<Custom>State 0xbf</Custom>
    					</Satellite>
    					<Satellite>
    						<SV>0</SV>
    						<SNR>0</SNR>
    						<CodeLocked>false</CodeLocked>
    						<Ephemeris>false</Ephemeris>
    						<Custom>State 0</Custom>
    					</Satellite>
    					<Satellite>
    						<SV>0</SV>
    						<SNR>0</SNR>
    						<CodeLocked>false</CodeLocked>
    						<Ephemeris>false</Ephemeris>
    						<Custom>State 0</Custom>
    					</Satellite>
    					<Satellite>
    						<SV>0</SV>
    						<SNR>0</SNR>
    						<CodeLocked>false</CodeLocked>
    						<Ephemeris>false</Ephemeris>
    						<Custom>State 0</Custom>
    					</Satellite>
    				</Satellites>
    				<GPSAltitude>60.079999999999998</GPSAltitude>
    				<GPSHeading>4.5038221347713678</GPSHeading>
    				<GPSSpeed>1.1299999999999999</GPSSpeed>
    				<GpsHDOP>1</GpsHDOP>
    				<NumberOfSatellites>8</NumberOfSatellites>
    				<Latitude>0.82699800234292897</Latitude>
    				<Longitude>0.012723813275523074</Longitude>
    				<EHPE>6.8200000000000003</EHPE>
    				<Time>0.31</Time>
    				<UTC>2016-09-20T09:57:29Z</UTC>
    				<SampleType>gps-base</SampleType>
    			</Sample>
    			<Sample>
    				<VerticalSpeed>0</VerticalSpeed>
    				<EnergyConsumption>83.73599999999999</EnergyConsumption>
    				<Temperature>300.54999999999995</Temperature>
    				<SeaLevelPressure>101280</SeaLevelPressure>
    				<Altitude>-12</Altitude>
    				<Distance>0</Distance>
    				<Speed>0.89000000000000001</Speed>
    				<Time>0.38200000000000001</Time>
    				<SampleType>periodic</SampleType>
    				<UTC>2016-09-20T09:57:29.072Z</UTC>
    			</Sample>
    			<Sample>
    				<VerticalSpeed>0</VerticalSpeed>
    				<EnergyConsumption>83.73599999999999</EnergyConsumption>
    				<Temperature>300.54999999999995</Temperature>
    				<SeaLevelPressure>101280</SeaLevelPressure>
    				<Altitude>-12</Altitude>
    				<Distance>0</Distance>
    				<Speed>0.93000000000000005</Speed>
    				<Time>1.3220000000000001</Time>
    				<SampleType>periodic</SampleType>
    				<UTC>2016-09-20T09:57:30.012Z</UTC>
    			</Sample>
    			<Sample>
    				<Latitude>0.826998072156099</Latitude>
    				<Longitude>0.012723184956992361</Longitude>
    				<EHPE>6.8200000000000003</EHPE>
    				<Time>2.1000000000000001</Time>
    				<UTC>2016-09-20T09:57:31Z</UTC>
    				<SampleType>gps-tiny</SampleType>
    			</Sample>
    			<Sample>
    				<Time>2.2720000000000002</Time>
    				<Events>
    					<Distance>
    						<Source>Gps</Source>
    						<UTC>2016-09-20T09:57:30.962Z</UTC>
    					</Distance>
    				</Events>
    				<UTC>2016-09-20T09:57:30.962Z</UTC>
    			</Sample>
    			<Sample>
    				<VerticalSpeed>0</VerticalSpeed>
    				<EnergyConsumption>83.73599999999999</EnergyConsumption>
    				<Temperature>300.54999999999995</Temperature>
    				<SeaLevelPressure>101280</SeaLevelPressure>
    				<Altitude>-12</Altitude>
    				<Distance>0</Distance>
    				<Speed>1.0900000000000001</Speed>
    				<Time>2.383</Time>
    				<SampleType>periodic</SampleType>
    				<UTC>2016-09-20T09:57:31.073Z</UTC>
    			</Sample>					
    		</Samples>
    		<R-R>
    			<Data>7223 510 705 204 692 254 428 667 672 403 270 669 578 717 696 480 708 752 654 643 634 633 627 380 252 481 717 371 262 619 554 662 624 627 287 339 428 685 691 595 572 312 304 413 737 375 822 265 262 455 696 387 774 350 704 645 574 555 568 557 568 565 615 598 579 420 758 580 553 573 583 554 540 576 534 565 543 412 669 553 540 470 413 724 556 538 542 539 536 533 538 546 538 554 522 551 529 553 527 552 270 257 554 530 542 535 539 548 536 543 536 565 528 511 400 733 564 552 433 667 521 592 554 542 561 547 470 617 477 589 548 532 524 542 476 450 437 750 531 387 621 552 253 269 512 494 556 519 454 587 519 448 583 449 422 665 379 635 177 332 509 500 515 341 669 478 534 492 485 356 666 503 506 504 515 516 518 529 516 529 516 520 406 643 513 556 534 544 533 473 614 399 700 514 327 748 593 545 378 710 564 266 274 482 626 489 626 549 550 551 556 550 559 548 567 547 579 549 587 557 591 554 578 557 535 555 441 669 554 566 601 547 649 622 566 458 754 627 622 594 411 836 580 615 604 573 474 708 613 582 360 769 622 478 721 608 585 609 459 664 140 571 604 292 270 458 728 440 744 595 586 573 614 577 625 625 594 467 763 595 520 656 414 767 611 533 650 519 707 631 524 665 593 519 398 839 312 833 543 553 540 523 595 460 693 386 742 392 753 561 464 428 713 683 458 654 569 541 470 632 549 538 557 548 565 543 553 368 727 437 387 289 420 691 570 566 374 772 553 516 621 582 559 577 540 399 711 402 710 553 533 398 682 543 528 473 602 463 411 721 545 531 417 648 465 591 479 567 525 524 523 530 540 424 663 464 645 456 651 559 538 535 282 260 475 426 715 371 684 381 696 427 680 428 399 270 473 640 478 630 568 284 263 574 533 429 695 582 544 571 566 431 745 345 728 679 601 576 586 540 631 600 563 601 594 576 595 564 584 559 452 670 523 588 571 342 708 610 500 350 268 440 691 575 547 423 708 562 563 351 770 339 668 642 486 601 495 587 541 527 534 541 515 471 585 528 536 528 529 527 534 548 520 371 753 318 718 390 741 561 540 551 527 463 405 759 281 398 324 404 753 348 708 578 540 553 546 395 733 388 708 577 554 380 714 570 553 389 715 561 542 542 543 407 688 541 550 568 544 387 706 414 702 545 545 462 642 425 693 404 685 397 711 407 679 536 528 410 642 477 595 535 335 723 375 705 354 727 567 539 361 727 382 685 482 351 752 529 531 436 404 728 382 721 404 665 552 538 455 642 486 579 541 519 535 428 634 534 328 726 537 527 397 405 743 520 516 512 519 496 519 503 520 526 519 538 519 464 578 517 527 494 518 527 503 443 415 634 511 500 496 477 542 499 443 551 514 444 435 618 515 509 505 537 515 521 528 517 525 337 707 253 283 495 450 572 505 499 501 137 352 500 187 287 469 514 495 470 532 480 446 544 504 503 492 491 511 499 480 363 697 365 675 421 378 723 536 509 539 526 494 564 520 548 506 462 594 534 358 668 532 307 722 383 714 400 691 568 544 464 683 417 700 565 545 406 1073 682 448 615 541 544 541 387 718 386 715 380 714 584 522 358 746 550 532 387 691 463 625 475 395 711 627 493 625 502 605 473 644 557 554 525 381 708 587 538 423 639 459 378 775 554 559 560 502 626 585 561 442 700 432 700 439 681 565 545 392 706 397 702 564 540 558 532 426 676 567 542 556 534 519 537 536 520 550 336 693 457 637 465 630 561 294 251 453 629 484 334 272 455 591 525 539 517 533 528 542 333 739 396 681 547 532 457 610 533 546 534 393 675 447 605 518 546 531 548 536 391 671 450 378 266 500 593 500 613 558 534 530 559 528 395 395 274 472 614 467 380 369 407 595 482 659 577 555 546 303 750 361 728 587 504 368 736 404 688 561 259 290 450 658 479 633 490 397 774 559 558 318 725 399 753 363 735 379 734 576 548 575 546 406 702 466 359 279 471 634 478 642 487 383 808 551 505 614 574 327 735 370 268 452 697 610 584 574 583 564 574 560 570 261 272 564 537 543 562 553 548 555 558 567 564 564 580 576 569 587 558 587 553 576 556 564 547 411 689 550 530 541 518 503 569 527 392 674 539 261 268 481 598 523 372 723 545 535 540 529 468 604 519 560 531 412 669 443 648 493 601 545 362 723 551 541 425 668 563 274 267 472 643 498 619 577 554 577 252 295 565 548 570 548 574 552 467 635 500 589 545 541 527 541 536 552 547 551 551 500 604 570 552 578 558 566 550 480 353 278 566 555 576 551 571 541 559 541 544 537 541 554 547 562 551 567 549 562 541 556 521 555 536 550 541 542 548 540 524 540 542 536 470 608 542 561 554 551 555 538 540 544 536 545 525 533 514 530 530 513 525 524 527 530 528 536 525 538 536 548 549 545 551 534 547 538 557 542 554 547 547 534 542 531 525 534 530 546 537 554 544 568 545 567 553 563 549 561 543 561 536 554 534 542 545 527 541 523 536 526 529 531 526 534 529 538 523 526 527 519 531 527 516 529 511 491 546 500 507 514 502 503 501 501 510 504 502 510 502 503 512 500 508 518 500 513 513 504 512 515 511 523 514 527 529 521 534 532 543 534 529 541 513 527 533 526 544 528 532 526 511 519 506 520 520 506 521 511 513 518 523 530 537 529 537 519 525 541 518 530 522 528 541 534 529 527 527 539 509 499 539 513 523 528 537 536 531 535 510 536 516 528 514 535 529 542 536 536 534 525 543 527 537 541 526 539 522 549 528 533 538 542 550 545 546 545 541 531 541 541 533 530 529 537 539 542 553 550 560 577 590 590 605 574 613 590 579 634 577 608 590 583 571 582 514 605 583 576 560 559 550 562 563 549 543 564 547 557 563 559 560 551 572 546 565 553 545 550 548 562 540 546 540 544 548 537 554 531 559 549 564 561 567 564 563 560 554 563 550 551 538 541 525 543 525 537 530 527 537 528 545 534 552 536 553 545 545 553 536 554 529 543 530 533 538 522 530 524 518 533 516 519 525 508 526 517 486 545 503 509 515 507 505 513 500 508 514 500 507 514 507 515 517 509 513 522 510 515 519 509 513 524 513 516 525 510 523 521 517 528 515 529 528 513 530 521 497 546 500 515 516 505 522 513 509 522 527 519 534 529 525 537 523 540 529 521 526 507 517 528 504 525 516 511 525 514 521 524 512 536 533 525 535 522 541 540 537 550 529 537 525 524 539 516 525 512 514 519 511 534 531 542 537 532 542 534 547 522 536 532 540 541 519 535 525 512 523 518 523 516 513 520 524 511 523 500 508 519 509 528 518 505 534 510 525 519 507 517 513 513 520 502 503 512 502 499 497 505 497 494 495 490 476 481 478 485 470 473 472 467 468 470 467 471 474 467 464 475 474 468 471 478 480 465 483 485 474 481 486 487 484 485 491 482 492 500 485 489 509 500 496 502 500 488 498 494 493 508 499 500 517 513 521 526 518 533 516 528 540 517 549 526 546 541 533 541 518 545 515 505 513 508 508 521 510 521 527 517 547 528 556 541 550 541 555 551 539 556 534 557 514 537 525 537 534 518 540 529 555 546 558 536 553 552 530 543 531 543 529 548 550 540 547 534 544 526 554 542 548 546 555 567 548 558 537 561 541 559 527 536 530 532 534 520 541 530 534 542 525 536 513 526 519 519 528 513 528 532 519 538 528 536 528 519 525 514 524 514 514 521 510 532 524 513 536 521 538 539 532 541 536 564 535 565 540 554 519 545 525 521 539 518 529 535 514 523 512 524 529 518 534 513 542 526 524 542 528 557 530 549 524 538 542 527 540 521 536 517 507 519 508 513 527 523 535 537 537 541 526 528 522 540 516 535 540 525 549 520 537 528 538 544 525 544 531 552 526 552 528 531 541 538 544 536 546 528 545 537 526 541 528 544 520 545 538 541 536 527 551 522 541 534 539 540 532 555 535 551 527 562 546 564 526 557 539 537 531 522 539 512 531 525 522 537 529 552 551 571 555 586 560 590 561 579 557 570 551 565 539 561 544 558 541 563 541 567 533 568 541 560 545 478 656 586 554 586 573 574 592 559 592 553 579 556 576 553 585 544 588 552 581 566 582 556 602 575 560 570 556 563 547 549 551 534 562 545 569 564 584 575 595 588 573 601 581 589 577 582 576 568 571 549 577 556 571 556 579 556 572 562 587 546 577 542 566 549 549 542 523 536 531 532 531 520 541 522 536 537 524 537 530 530 533 519 534 521 520 527 514 519 521 514 519 522 515 522 513 511 517 505 505 514 503 506 518 510 517 523 517 528 521 531 536 524 541 526 534 530 521 533 514 524 524 513 529 523 516 530 518 539 529 527 532 519 549 517 543 533 517 531 509 522 520 506 525 506 515 523 503 521 518 509 528 521 528 533 525 541 531 539 539 533 547 531 550 528 537 542 529 541 550 551 522 552 525 543 558 517 528 516 517 525 505 532 522 518 536 531 549 538 559 544 542 569 569 564 544 566 551 577 555 562 536 547 534 541 541 516 535 516 540 541 537 547 534 532 522 529 536 516 530 508 519 529 519 529 518 517 523 523 521 521 519 530 509 523 511 510 520 519 508 525 503 519 527 520 544 535 524 523 541 529 515 532 514 532 524 517 518 509 524 514 505 517 518 502 525 506 517 515 511 531 517 531 541 528 545 525 560 529 541 538 549 541 524 542 530 541 514 531 531 521 533 515 517 515 503 517 500 501 513 502 284 746 508 523 516 517 531 513 533 523 538 537 532 548 532 550 533 568 527 540 541 527 544 521 540 527 548 536 539 542 518 548 524 550 530 541 527 522 536 529 539 516 519 540 529 539 530 542 532 544 550 534 544 532 547 534 554 541 530 536 509 531 527 511 529 528 541 546 556 541 572 554 579 559 593 553 594 543 590 557 586 564 584 558 578 541 558 539 564 542 569 565 580 552 596 561 587 566 571 587 574 598 580 624 579 634 587 587 621 570 620 574 572 590 559 590 549 573 565 597 578 594 576 576 572 565 575 556 558 551 546 560 561 577 579 580 581 570 593 559 450 693 561 540 563 546 561 563 561 558 560 563 552 559 547 566 543 555 537 559 536 552 541 548 540 541 547 533 551 542 557 539 554 541 539 541 528 541 523 525 519 518 538 513 523 530 547 550 536 559 538 549 532 564 539 544 542 520 543 521 534 507 510 529 511 519 506 507 517 497 506 510 498 500 502 492 483 500 485 496 486 493 492 513 502 516 508 504 513 496 499 505 501 500 502 501 516 520 507 526 510 522 500 507 522 503 522 493 506 521 503 521 503 501 516 508 515 516 505 514 516 506 510 512 516 531 519 551 532 537 547 537 555 525 562 523 541 535 535 545 526 550 537 549 538 553 546 567 550 572 550 560 558 544 557 543 557 541 562 538 577 543 566 554 567 557 584 540 580 549 564 551 575 534 555 547 562 545 546 532 536 546 535 541 536 548 536 547 548 538 554 546 563 536 561 548 559 537 570 533 552 531 542 532 524 533 521 530 525 518 530 509 518 537 518 531 509 518 524 513 523 500 511 514 500 500 504 495 508 497 496 500 501 373 620 508 505 512 508 511 520 511 520 503 502 497 496 491 495 492 498 483 492 493 484 492 498 491 500 500 501 514 505 503 519 501 513 507 496 505 485 492 494 492 492 495 486 484 496 494 495 503 501 502 513 504 513 516 511 520 500 508 515 504 515 509 514 516 504 510 511 495 502 504 500 508 502 509 528 514 533 537 541 537 538 547 535 554 535 550 539 541 547 537 549 528 548 546 549 542 536 529 523 532 517 526 525 521 532 521 539 529 531 535 518 524 533 517 528 516 510 505 506 498 500 502 490 500 496 463 489 469 479 465 474 466 466 469 475 463 478 474 482 489 479 493 501 493 505 497 491 496 497 487 492 505 484 495 485 481 486 474 476 475 473 485 461 476 480 477 477 480 493 487 483 493 499 491 500 501 500 491 496 502 500 494 500 502 497 495 514 498 506 503 494 500 481 490 494 491 491 499 492 511 504 491 500 507 499 508 501 502 520 507 499 505 497 498 501 495 498 508 500 505 511 500 517 511 508 515 502 507 506 492 503 485 487 488 493 479 492 497 480 499 505 492 508 511 502 513 505 510 515 501 514 509 500 511 502 502 511 499 509 513 499 517 513 508 516 511 509 514 500 510 507 498 506 500 500 506 498 507 504 497 510 504 501 510 509 513 516 509 524 504 519 521 506 520 510 515 516 504 509 507 494 504 500 496 509 505 499 509 505 507 509 489 501 507 495 506 509 492 504 508 492 507 515 501 517 513 515 524 508 520 510 503 508 500 495 501 496 491 498 495 494 502 491 495 507 491 500 509 494 503 508 494 502 501 492 499 500 489 500 499 489 498 500 488 498 498 490 500 497 489 502 496 492 498 495 494 500 490 494 502 492 494 496 485 481 495 484 492 495 482 488 495 482 487 484 477 483 486 476 481 483 476 482 480 474 474 485 477 475 482 483 473 482 484 474 478 486 481 476 481 486 475 475 481 477 472 483 486 479 488 494 487 493 501 499 502 508 496 507 506 494 503 500 490 500 494 490 499 493 492 502 497 498 511 500 511 514 502 517 510 506 515 500 507 513 499 511 511 507 519 512 523 513 515 525 508 525 520 520 521 513 523 510 513 519 505 519 508 510 515 508 514 517 507 525 502 524 511 513 517 510 521 511 516 519 508 523 509 514 520 513 524 511 532 524 515 523 512 521 511 511 517 495 514 514 499 516 509 515 510 506 517 506 512 518 502 519 509 508 510 500 504 507 499 507 497 508 506 500 513 504 504 513 501 507 505 497 504 507 498 508 498 510 512 504 519 503 516 510 510 518 507 523 510 515 511 501 511 500 500 506 494 509 503 500 511 502 502 514 503 515 504 513 514 501 523 508 512 523 509 522 509 528 518 518 524 512 524 511 527 520 519 530 515 530 515 526 520 516 522 512 531 512 529 530 527 535 525 541 522 538 527 541 528 537 536 529 531 524 533 523 536 529 536 523 540 527 537 537 530 532 524 535 518 532 516 527 523 510 521 513 513 514 501 512 507 503 507 494 501 504 495 502 500 495 501 498 495 508 497 505 504 497 507 499 497 507 495 504 506 497 505 500 495 505 495 497 497 491 489 503 487 498 495 492 502 490 495 500 485 494 496 482 490 490 479 475 505 477 481 489 482 490 488 475 483 493 479 484 490 480 484 488 486 480 490 484 482 487 487 481 490 490 485 497 491 489 491 497 485 488 500 487 492 490 483 492 487 481 493 490 482 492 495 485 493 498 486 496 498 490 500 494 494 502 493 501 502 486 502 499 488 497 491 480 487 483 475 490 493 482 499 502 494 507 500 502 514 503 513 510 502 514 500 513 515 446 576 508 509 513 508 521 513 506 522 505 524 513 512 523 508 520 509 510 516 500 516 513 505 513 501 509 508 503 506 506 496 505 499 488 492 502 495 507 507 497 506 508 497 511 508 502 513 503 507 507 495 508 503 499 509 501 503 519 508 523 522 516 527 513 528 516 526 523 513 528 514 517 519 510 518 509 512 516 505 520 515 510 522 515 528 529 521 534 518 538 526 535 535 530 536 526 540 519 520 518 500 509 508 501 514 506 514 512 505 516 495 513 516 510 525 514 538 517 529 532 517 529 523 529 523 512 524 507 521 536 521 536 522 530 523 532 532 529 541 525 544 525 550 538 547 532 538 532 525 538 522 541 525 544 535 551 546 546 567 539 537 521 534 510 530 519 520 524 514 532 512 541 526 530 538 529 541 529 552 532 548 529 538 541 532 539 525 543 525 548 542 559 537 575 541 566 544 569 547 583 537 567 549 568 536 561 547 560 538 583 540 571 546 565 541 563 537 572 537 555 541 555 538 554 537 547 537 541 536 529 541 528 541 528 542 528 540 538 541 541 532 546 536 548 532 548 534 554 537 552 534 548 536 545 539 535 542 534 539 528 540 519 541 524 533 524 514 522 506 515 513 503 512 507 511 508 504 514 514 506 516 503 519 511 502 514 507 508 506 498 507 500 497 502 492 500 506 492 505 509 499 511 508 504 511 501 510 506 500 503 494 499 500 487 494 500 482 488 493 481 489 487 481 487 489 485 483 489 486 484 484 489 478 486 475 469 473 470 469 460 467 472 456 463 473 459 468 474 466 472 470 465 474 469 474 481 466 474 480 468 473 475 476 468 475 477 466 472 476 469 467 477 475 465 478 482 470 480 489 475 485 488 478 480 484 472 480 485 475 479 483 471 475 484 476 478 484 482 486 497 485 499 502 493 509 503 499 518 500 512 505 500 514 498 508 514 500 516 513 522 514 508 522 505 529 524 541 524 552 528 531 531 516 530 510 527 512 518 513 517 524 512 525 523 517 523 513 527 512 523 521 510 526 513 526 513 519 525 512 527 509 527 518 513 521 507 525 512 519 515 505 518 502 508 512 498 518 507 501 515 510 519 515 508 524 497 513 504 510 512 504 518 510 512 521 505 522 510 519 516 505 520 503 515 509 499 510 500 506 504 496 504 500 491 501 496 504 504 501 519 506 522 516 509 522 500 507 513 500 513 511 511 517 508 517 506 519 518 509 523 509 516 521 509 523 505 521 521 506 522 514 520 515 513 523 504 524 518 517 526 512 522 518 515 526 506 524 514 511 522 515 521 514 516 521 506 523 514 515 515 506 520 506 512 518 507 521 515 522 521 515 529 519 526 515 523 521 517 534 517 535 523 536 524 530 534 515 533 515 530 517 527 531 526 529 516 531 509 530 515 521 527 515 536 520 542 529 545 522 547 530 528 526 518 526 512 527 517 537 520 537 537 536 537 529 539 516 540 528 534 524 523 523 517 544 533 546 529 546 529 539 526 541 524 537 519 517 524 509 527 511 520 508 503 509 501 508 507 497 511 500 502 509 496 498 499 490 497 495 487 498 493 485 495 492 483 498 491 490 499 494 498 507 493 505 502 498 504 496 501 499 489 495 500 480 502 486 488 500 490 500 505 490 507 503 502 513 505 517 501 509 507 495 512 507 505 516 503 516 509 503 510 491 505 500 499 518 506 519 509 507 519 508 528 520 533 525 523 531 520 533 516 531 516 530 524 525 520 508 520 505 523 508 503 513 499 514 509 495 505 493 500 506 499 519 520 525 518 520 521 517 513 519 514 518 509 507 502 505 509 500 513 509 516 515 507 513 502 516 506 513 515 510 523 509 520 521 509 522 516 529 520 520 528 520 529 518 536 516 532 523 527 529 519 536 517 553 522 541 540 540 546 534 542 522 538 517 528 525 515 524 511 522 514 511 523 508 528 519 519 534 517 531 515 530 524 536 529 531 540 526 538 522 535 519 535 522 540 520 539 532 544 535 537 536 537 534 525 540 526 542 532 549 529 562 531 548 533 566 528 544 534 547 531 543 534 539 541 535 540 530 541 530 541 527 542 521 541 527 539 523 541 525 533 536 528 535 517 537 519 536 517 536 519 520 529 515 531 509 531 521 524 527 519 528 516 531 519 530 518 521 526 512 523 511 521 510 518 519 508 525 515 528 515 513 524 507 520 519 513 520 514 521 510 511 515 502 520 511 513 524 505 515 500 507 506 493 500 499 492 511 503 510 513 504 521 512 526 521 514 526 513 525 513 522 516 511 521 507 523 506 506 519 505 521 505 508 516 500 516 509 508 515 500 517 510 508 514 500 513 506 506 510 500 517 507 505 515 505 511 510 502 512 500 514 513 504 518 509 517 517 510 524 503 521 515 508 518 507 524 508 520 519 522 531 516 531 518 546 520 543 534 547 539 538 534 521 539 514 536 518 533 526 522 535 514 536 524 535 519 543 520 525 532 522 421 628 533 513 525 517 511 518 508 526 520 520 532 516 529 510 525 518 519 520 507 514 510 518 516 505 517 507 508 512 503 517 501 513 511 501 515 506 512 514 506 517 504 519 514 507 523 510 527 512 511 524 506 528 518 530 524 527 535 528 532 519 532 518 531 522 529 518 519 517 508 524 511 518 511 512 530 517 537 524 540 519 552 514 531 518 519 519 509 517 504 511 506 497 511 518 512 508 515 510 503 514 507 513 519 508 522 514 530 512 517 523 506 521 512 516 514 505 516 501 514 508 500 517 506 520 514 513 521 506 525 509 527 509 516 523 504 516 509 515 519 508 518 506 527 512 518 522 506 519 508 522 518 512 518 509 521 505 511 516 506 515 499 513 505 500 509 494 510 500 494 508 500 510 508 512 519 504 526 521 524 521 513 522 511 521 513 516 515 506 518 502 514 515 499 510 508 519 516 511 523 514 522 516 509 518 507 520 512 510 523 505 523 513 511 513 502 516 503 506 511 499 510 512 500 512 502 508 509 496 509 501 500 508 495 510 504 494 508 500 501 507 497 506 504 497 508 496 504 504 490 500 503 492 509 495 497 507 492 502 499 496 507 490 499 509 492 502 500 496 508 498 506 508 499 510 500 506 512 500 515 509 515 514 502 519 499 526 511 513 518 511 519 502 523 507 504 519 504 514 511 503 513 502 514 512 502 518 505 515 509 503 516 500 508 510 500 508 503 507 509 500 512 500 504 509 497 512 509 504 512 499 507 501 497 509 496 511 504 500 508 497 495 497 486 492 492 484 493 496 489 497 504 492 503 499 498 503 493 504 499 491 504 494 500 504 496 506 496 493 506 496 500 514 492 505 503 495 501 501 498 507 496 504 505 507 514 500 516 506 515 514 503 517 502 510 511 500 510 506 512 510 502 515 500 502 505 490 508 505 500 506 502 505 507 500 515 512 531 515 523 515 507 523 503 515 511 505 518 507 520 517 518 528 519 537 521 535 513 532 523 523 524 519 529 513 531 515 532 516 538 521 537 521 523 525 516 523 511 520 514 521 516 517 518 505 519 509 509 518 500 519 516 517 518 506 522 506 515 515 504 514 506 500 511 501 510 503 498 514 497 510 509 500 508 500 506 504 495 505 499 496 504 491 500 503 484 497 497 486 496 484 477 485 487 479 487 487 480 487 487 481 491 485 490 497 487 496 496 484 496 492 486 497 493 495 495 490 500 494 490 498 497 491 502 498 502 513 501 515 507 514 515 505 521 506 519 506 517 517 515 518 505 521 505 517 511 504 517 505 515 511 505 518 501 521 509 513 518 510 528 513 532 521 527 519 513 525 510 532 519 521 527 511 538 512 530 521 529 525 527 522 509 531 512 530 513 520 515 521 519 510 517 527 528 535 521 518 521 519 512 507 505 507 516 511 521 532 542 549 548 556 559</Data>
    		</R-R>
    	</DeviceLog>
    </sml>
    rmarion37

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Comment on retrouve le problème que vous constatez avec le code que vous avez posté?

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

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 19
    Par défaut
    Bonjour,

    En fait, mon programme (des lignes 108 à 115) permet de charger mon fichier .sml (qui est au format xml) dans une table minidom. Une fois que mon fichier sml est chargé, on peut se rendre compte dans la console Python le problème :

    * En tapant "sml" dans la console, on voit bien que l'élément DOM a été créé.
    * En tapant sml.chilNodes, toujours dans la console, on voit apparaitre le nœud <DeviceLog> (qui est un vrai nœud que l'on peut retrouver dans le fichier sml) et deux "faux" nœuds (\n\t et \n) qui n'apparaissent pas dans le fichier sml.

    Cela me cause des problèmes, car pour certaines informations du fichier sml, je vais avoir besoin de chercher les données via la numéro de nœud. Dans le cas présent, le nœud <DeviceLog> est le nœud N°1 alors qu'il devrait être le N°0.

    Que je vais au plus profond du fichier sml, ça devient vite le bordel.

    Comment peut-on nettoyer la table DOM de ces "faux" nœuds \n\t et \n ? J'ai bien essayer une fonction CleanDOM récupérée sur internet mais ça me corrompait la table DOM.

    Merci d'avance.

    rmarion37

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Citation Envoyé par rmarion37 Voir le message
    * En tapant "sml" dans la console, on voit bien que l'élément DOM a été créé.
    * En tapant sml.chilNodes, toujours dans la console, on voit apparaitre le nœud <DeviceLog> (qui est un vrai nœud que l'on peut retrouver dans le fichier sml) et deux "faux" nœuds (\n\t et \n) qui n'apparaissent pas dans le fichier sml.
    Je dirais que c'est ce qui fait la différence entre DOM et XML.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> root = tree.getroot()
    >>> root[0]
    <Element '{http://www.suunto.com/schemas/sml}DeviceLog' at 0x000000000611B2C8>
     
    >>> list(root[0])
    [<Element '{http://www.suunto.com/schemas/sml}Header' at 0x000000000611B368>, <E
    lement '{http://www.suunto.com/schemas/sml}Device' at 0x000000000611F638>, <Elem
    ent '{http://www.suunto.com/schemas/sml}Samples' at 0x000000000611F908>, <Elemen
    t '{http://www.suunto.com/schemas/sml}R-R' at 0x0000000006FA4C78>]
    >>>
    Le problème est dans le "pretty-printing", prenez un fichier comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0"?>
    <data>
        <country name="Liechtenstein">
            <rank>1</rank>
            <year>2008</year>
            <gdppc>141100</gdppc>
            <neighbor name="Austria" direction="E"/>
            <neighbor name="Switzerland" direction="W"/>
        </country>
    </data>
    Après le tag "data", il y a une fin des lignes et des blancs avant le tag "country" pour rendre le fichier plus lisible par l'humain.
    Techniquement, ces caractères là font partie du texte contenu dans <data>.... </data>.
    Un parseur XML le sait et les vire, un parseur DOM les préserve comme "text".

    Citation Envoyé par rmarion37 Voir le message
    Cela me cause des problèmes, car pour certaines informations du fichier sml, je vais avoir besoin de chercher les données via la numéro de nœud. Dans le cas présent, le nœud <DeviceLog> est le nœud N°1 alors qu'il devrait être le N°0.
    Utiliser un parseur XML (comme elementTree) devrait être une solution. Personnellement, un fichier XML contient des données que j'extrais dans d'autres structures de données que j'organise comme je veux et comme les fichiers XML ont tendances a être assez gros, je charge rarement le document (sauf pour tester) et j'extrais les données via SAX.

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

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 19
    Par défaut
    Merci pour la réponse. Je vais essayer les parsers xml ou sax. Je suis parti vers dom sans trop savoir. D'après ce que j'ai lu, la philosophie de sax est différente de celle de dom. Je vais me pencher sur la question.

    Juste une question : c'est quoi un "pretty printing" ?

    rmarion37

  14. #14
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Citation Envoyé par rmarion37 Voir le message
    Merci pour la réponse. Je vais essayer les parsers xml ou sax. Je suis parti vers dom sans trop savoir. D'après ce que j'ai lu, la philosophie de sax est différente de celle de dom. Je vais me pencher sur la question.
    DOM transforme le fichier XML en arbre qu'on va ensuite parcourir alors que SAX lit le fichier en vous permettant d'extraire les informations et de construire votre propre arbre. Lorsque vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from xml.dom.minidom import parse
    dom = parse('data.xml')  # parse an XML file by name
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import xml.etree.ElementTree as et
    tree = et.parse('data.xml')
    vous faites du DOM au sens où tout le fichier est lu pour produire un arbre.
    La différence est dans les "parseur" utilisés...

    Juste une question : c'est quoi un "pretty printing" ?
    C'est la différence entre un gros tas difficile à lire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0"?><data><country name="Liechtenstein"><rank>1</rank><year>2008</year><gdppc>141100</gdppc><neighbor name="Austria" direction="E"/><neighbor name="Switzerland" direction="W"/></country></data>
    et une mise en forme plus "jolie":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0"?>
    <data>
        <country name="Liechtenstein">
            <rank>1</rank>
            <year>2008</year>
            <gdppc>141100</gdppc>
            <neighbor name="Austria" direction="E"/>
            <neighbor name="Switzerland" direction="W"/>
        </country>
    </data>
    Avec minidom, l'arbre qui sera construit sera différent alors qu'avec un parseur XML, les informations de mises en forme seront ignorées.

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

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 19
    Par défaut
    J'ai eu le temps de me replonger un peu dans mon soft. J'ai trouvé l'origine de mon problème avec le parsing via minidom. En fait, dans le fichier xml, j'ai plusieurs entrées différentes qui ont le même nom (par ex. "Distance"). Donc les erreurs que mon soft génère sont normales; il suffit juste que je les ignore avec des commandes "TRY ... EXCEPT".

    Par contre, le temps d’exécution est énorme !! Je vais donc essayer de parser avec LXML ou eTree. Cela fait plusieurs jours que j'essaye mais je n'y arrive pas. J'ai essayé plusieurs codes différents :

    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
    # -*- coding: utf-8 -*-
    """
    Created on Sat Nov  5 23:01:26 2016
     
    @author: Remy
    """
     
    from lxml import etree
     
    #----------------------------------------------------------------------
    def parseXML(xmlFile):
        """
        Parse the xml
        """
     
        tree = etree.parse(xmlFile)
        root = tree.getroot()
     
        for sample in root.findall('Sample'):
            latitude = sample.find('Latitude').text
            print(latitude)
     
    if __name__ == "__main__":
        parseXML("D9F698461C000D00-2016-09-24T09_59_45-0.sml")
    ou :

    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
    # -*- coding: utf-8 -*-
    """
    Created on Sat Nov  5 23:01:26 2016
     
    @author: Remy
    """
     
    from lxml import etree
     
    #----------------------------------------------------------------------
    def parseXML(xmlFile):
        """
        Parse the xml
        """
     
        tree = etree.parse(xmlFile)
        root = tree.getroot()
     
        for latitude in tree.xpath("/sml/DeviceLog/Samples/Sample/Latitude"):
            print(latitude)
     
    if __name__ == "__main__":
        parseXML("D9F698461C000D00-2016-09-24T09_59_45-0.sml")
    ou :

    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
    # -*- coding: utf-8 -*-
    """
    Created on Sat Nov  5 23:01:26 2016
     
    @author: Remy
    """
     
    from lxml import etree
     
    #----------------------------------------------------------------------
    def parseXML(xmlFile):
        """
        Parse the xml
        """
     
        tree = etree.parse(xmlFile)
        root = tree.getroot()
     
        for latitude in tree.xpath("/sml/DeviceLog/Samples/Sample/Latitude"):
            print(latitude)
     
    if __name__ == "__main__":
        parseXML("D9F698461C000D00-2016-09-24T09_59_45-0.sml")
    Rien ne fonctionne !!! Je n'ai même pas de message d'erreur.

    Je ne comprend pas.

    rmarion37

  16. #16
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Citation Envoyé par rmarion37 Voir le message
    Rien ne fonctionne !!! Je n'ai même pas de message d'erreur.

    Je ne comprend pas.
    S'il n'y a pas d'erreur et que le programme se termine, alors c'est que l'expression passé en paramètre à .findall (et autre) n'est pas trouvée (dans l'arbre). Ce qui n'est pas surprenant puisque vous ne précisez pas le "namespace". Voir les exemples dans les tutos.

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

  17. #17
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 19
    Par défaut
    Merci pour le tuyau, je ne connaissais pas ce "concept" de namespace. J'ai gratté et j'arrive maintenant à dérouler le fichier XML avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    def parseXML(xmlFile):
        """
        Parse the xml
        """
     
        tree = etree.parse(xmlFile)
        ns = '{http://www.suunto.com/schemas/sml}'
     
        for elem in tree.iter(ns+'UTC'):
            print(elem.text)
     
    if __name__ == "__main__":
        parseXML("D9F698461C000D00-2016-09-24T09_59_45-0.sml")
    Par contre, je n'arrive pas à faire une boucle qui permettrait comme sur ma version Minidom de créer un tuple avec (UTC, Latitude, Longitude, ...) pour chaque nœud "Sample" lu. Càd :

    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
    from lxml import etree
     
    #----------------------------------------------------------------------
    def parseXML(xmlFile):
        """
        Parse the xml
        """
    
        tree = etree.parse(xmlFile)
        ns = '{http://www.suunto.com/schemas/sml}'
        
        for elem in tree.iter(ns+'Sample'):
            UTC = Texte du nœud UTC sous le nœud Sample
            latitude = Texte du nœud Latitude sous le nœud Sample
            .
            .
            .
            ligne = (UTC, latitude, ....)
            lignes.append(ligne)
    
    if __name__ == "__main__":
        parseXML("D9F698461C000D00-2016-09-24T09_59_45-0.sml")
    J'ai essayé de trouver une fonction qui prend directement les nœuds "enfant" sous le nœud "Sample". Rien. J'ai joué avec la fonction list() mais sans succès.

    Avez-vous des idées ? Merci d'avance.

    rmaion37

  18. #18
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Citation Envoyé par rmarion37 Voir le message
    J'ai essayé de trouver une fonction qui prend directement les nœuds "enfant" sous le nœud "Sample". Rien. J'ai joué avec la fonction list() mais sans succès.
    Il faut apprendre à jouer avec la console:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import xml.etree.ElementTree as et
    >>> tree = et.parse('D9F698461C000D00-2016-09-20T11_57_28-0.sml')
    >>> ns = '{http://www.suunto.com/schemas/sml}'
    >>> it = tree.iter(ns+'Sample')
    on se place sur le premier element "Sample":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> e = next(it)
    >>> e
    <Element '{http://www.suunto.com/schemas/sml}Sample' at 0x0000000002F18E08>
    Cet élément en contient d'autres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> list(e)
    [<Element '{http://www.suunto.com/schemas/sml}UTC' at 0x0000000002F18E58>, <Elem
    ent '{http://www.suunto.com/schemas/sml}Time' at 0x0000000002F18EF8>, <Element '
    {http://www.suunto.com/schemas/sml}Events' at 0x0000000002F18F98>]
    qu'il faut aller chercher...

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

  19. #19
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 19
    Par défaut
    Salut,

    Merci pour les infos, j'ai trouvé un truc qui fonctionne plutôt pas mal :

    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
    # -*- coding: utf-8 -*-
    """
    Created on Sat Nov  5 23:01:26 2016
     
    @author: Remy
    """
     
    import pandas
    import matplotlib.pyplot as plt
    import numpy as numpy
     
    from lxml import etree
     
    lignes = []
     
    def parseXML(xmlFile, ns):
        "Parse the xml"
     
        tree = etree.parse(xmlFile)
        root = tree.getroot()
     
        for elem in root.iter(ns+'Sample'):
            try:
                UTCtime = elem.findtext(ns+'UTC')
            except ValueError:
                print('Erreur')
     
            try:            
                time = float(elem.findtext(ns+'Time'))
            except ValueError:
                print('Erreur')
     
            try:
                latitude = elem.findtext(ns+'Latitude')
            except ValueError:
                print('Erreur')
     
            try:
                longitude = elem.findtext(ns+'Longitude')
            except ValueError:
                print('Erreur')
     
            try:
                distance = elem.findtext(ns+'Distance')
            except ValueError:
                print('Erreur')
     
            try:
                speed = elem.findtext(ns+'Speed')
            except ValueError:
                print('Erreur')
     
            try:
                cadence = elem.findtext(ns+'Cadence')
            except ValueError:
                print('Erreur')
     
            try:
                altitude = elem.findtext(ns+'Altitude')
            except ValueError:
                print('Erreur')
     
            try:
                gpsaltitude = elem.findtext(ns+'GPSaltitude')
            except ValueError:
                print('Erreur')
     
            try:
                heartrate = elem.findtext(ns+'HR')
            except ValueError:
                print('Erreur')
     
            try:
                energy = elem.findtext(ns+'EnergyConsumption')
            except ValueError:
                print('Erreur')
     
            try:
                temperature = elem.findtext(ns+'Temperature')
            except ValueError:
                print('Erreur')
     
            ligne = (UTCtime, time, latitude, longitude, distance, speed, cadence, altitude, gpsaltitude, heartrate, energy, temperature)                
            lignes.append(ligne)
     
     
    def main():
        "Programme principal"
        global df
     
        namespace = '{http://www.suunto.com/schemas/sml}'
        parseXML("D9F698461C000D00-2016-09-24T09_59_45-0.sml", namespace)
     
        colonnes = ['UTCtime', 'time', 'latitude', 'longitude', 'distance', 'speed', 'cadence', 'altitude', 'gpsaltitude', 'heartrate', 'energy', 'temperature']
        df = pandas.DataFrame(data = lignes, columns = colonnes)
        df.fillna(value=numpy.nan, inplace=True)
     
        print(df['longitude'], df['latitude'])
     
    if __name__ == "__main__":
        main()
    Ma "boucle for" se sert de iter() pour itérer dans les nœuds "sample" et à l'intérieur de ces nœuds (variable elem de la boucle for), je trouve les données qui m’intéressent avec findtext().
    Et contrairement à Minidom, avec lxml, j'ai pas d'erreur qui remonte. Je vais même pourvoir enlever les "try: except" qui me permettaient avec Minidom de traiter ces erreurs.

    Il ne me reste plus qu'à transformer les valeurs en float et int pour pouvoir les traiter avec Pandas.

    Je commence à retrouver mes réflexes d'il y a 25 ans quand j'ai arrêté de programmer (en Pascal bien sûr !!). Je cherche, je cherche ...

    rmarion37

  20. #20
    Membre averti
    Homme Profil pro
    Ingénieur mécanique
    Inscrit en
    Octobre 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 19
    Par défaut
    Merci pour l'aide. Le soft fonctionne bien. Avec LXML, je n'ai pas d'erreur de parsing (comme avec Minidom) et la vitesse de parsing est de 4x supérieure.

    Merci encore.

    rmarion37

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

Discussions similaires

  1. [SAX] Problème de parsing avec SAX
    Par blueLight dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 28/08/2009, 23h17
  2. [JAXB] Problème parsing XML avec XSD validant
    Par vano dans le forum Persistance des données
    Réponses: 2
    Dernier message: 26/08/2008, 09h59
  3. [JDOM] java & XML, problème de parsing avec JDOM
    Par OreillePointue dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 11/01/2008, 10h17
  4. [DOM] Problème de parsing avec DomParser
    Par iam_free dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 21/04/2006, 09h33
  5. Problème de parsing avec tomcat
    Par groupe51 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 20/04/2006, 09h28

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