Import TCX to R using XML Package

I am trying to import GPS performance data into R from a TCX file using an XML package. Here is a small sample of the data that I have (with only three track points instead of ~ 900)

<?xml version="1.0" encoding="UTF-8"?> <TrainingCenterDatabase xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2"> <Activities> <Activity Sport="Running"> <Id>2011-10-30T16:05:48Z</Id> <Lap StartTime="2011-10-30T16:05:48Z"> <TotalTimeSeconds>3855.99</TotalTimeSeconds> <DistanceMeters>12498.8115</DistanceMeters> <MaximumSpeed>4.45662498</MaximumSpeed> <Calories>1011</Calories> <Intensity>Active</Intensity> <TriggerMethod>Manual</TriggerMethod> <Track> <Trackpoint> <Time>2011-10-30T16:05:48Z</Time> <Position> <LatitudeDegrees>52.33613318</LatitudeDegrees> <LongitudeDegrees>-1.58814317</LongitudeDegrees> </Position> <AltitudeMeters>77.5234375</AltitudeMeters> <DistanceMeters>0.00000000</DistanceMeters> </Trackpoint> <Trackpoint> <Time>2011-10-30T16:05:49Z</Time> <Position> <LatitudeDegrees>52.33614810</LatitudeDegrees> <LongitudeDegrees>-1.58814283</LongitudeDegrees> </Position> <AltitudeMeters>77.5234375</AltitudeMeters> <DistanceMeters>1.77584004</DistanceMeters> </Trackpoint> <Trackpoint> <Time>2011-10-30T16:05:54Z</Time> <Position> <LatitudeDegrees>52.33627098</LatitudeDegrees> <LongitudeDegrees>-1.58818323</LongitudeDegrees> </Position> <AltitudeMeters>76.0814209</AltitudeMeters> <DistanceMeters>15.7694969</DistanceMeters> </Trackpoint> </Track> </Lap> </Activity> </Activities> </TrainingCenterDatabase> 

And I'm trying to read breakpoints using

 doc = xmlParse("filetest.tcx") xmlToDataFrame(nodes = getNodeSet(doc, "//Trackpoint")) 

However, this fails, and the result is an empty data frame. However, I found that if I remove

  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" 

from the TrainingCenterDatabase tag at the beginning of the file, this import is performed correctly as expected. I.e. using the following data:

 <?xml version="1.0" encoding="UTF-8"?> <TrainingCenterDatabase> <Activities> <Activity Sport="Running"> <Id>2011-10-30T16:05:48Z</Id> <Lap StartTime="2011-10-30T16:05:48Z"> <TotalTimeSeconds>3855.99</TotalTimeSeconds> <DistanceMeters>12498.8115</DistanceMeters> <MaximumSpeed>4.45662498</MaximumSpeed> <Calories>1011</Calories> <Intensity>Active</Intensity> <TriggerMethod>Manual</TriggerMethod> <Track> <Trackpoint> <Time>2011-10-30T16:05:48Z</Time> <Position> <LatitudeDegrees>52.33613318</LatitudeDegrees> <LongitudeDegrees>-1.58814317</LongitudeDegrees> </Position> <AltitudeMeters>77.5234375</AltitudeMeters> <DistanceMeters>0.00000000</DistanceMeters> </Trackpoint> <Trackpoint> <Time>2011-10-30T16:05:49Z</Time> <Position> <LatitudeDegrees>52.33614810</LatitudeDegrees> <LongitudeDegrees>-1.58814283</LongitudeDegrees> </Position> <AltitudeMeters>77.5234375</AltitudeMeters> <DistanceMeters>1.77584004</DistanceMeters> </Trackpoint> <Trackpoint> <Time>2011-10-30T16:05:54Z</Time> <Position> <LatitudeDegrees>52.33627098</LatitudeDegrees> <LongitudeDegrees>-1.58818323</LongitudeDegrees> </Position> <AltitudeMeters>76.0814209</AltitudeMeters> <DistanceMeters>15.7694969</DistanceMeters> </Trackpoint> </Track> </Lap> </Activity> </Activities> </TrainingCenterDatabase> 

And I get the dataframe core that I want: (except for a position that is not divided into lat and long, but I expect that I can handle this if someone does not offer an easier way to do this directly using XPath ?)

 > xmlToDataFrame(nodes = getNodeSet(doc, "//Trackpoint")) Time Position AltitudeMeters DistanceMeters 1 2011-10-30T16:05:48Z 52.33613318-1.58814317 77.5234375 0.00000000 2 2011-10-30T16:05:49Z 52.33614810-1.58814283 77.5234375 1.77584004 3 2011-10-30T16:05:54Z 52.33627098-1.58818323 76.0814209 15.7694969 

Obviously, I don't want to manually delete this from any file I want to import. Is there something that I am doing wrong (perhaps with XPath?), What prevents this from working, or is there any work to remove a section from XML data?

Thank you very much

+4
source share
1 answer

This is a namespace issue. Just do it

 xmlToDataFrame(nodes <- getNodeSet(doc, "//ns:Trackpoint", "ns")) 

To get a direct separation of latitude and longitude, you can do the following

 nodes <- getNodeSet(doc, "//ns:Trackpoint", "ns") mydf <- plyr::ldply(nodes, as.data.frame(xmlToList)) setNames(mydf, c('time', 'lat', 'long', 'alt', 'distance')) 

He gives

  time lat long alt distance 1 2011-10-30T16:05:48Z 52.33613318 -1.58814317 77.5234375 0.00000000 2 2011-10-30T16:05:49Z 52.33614810 -1.58814283 77.5234375 1.77584004 3 2011-10-30T16:05:54Z 52.33627098 -1.58818323 76.0814209 15.7694969 
+9
source

Source: https://habr.com/ru/post/1383212/


All Articles