Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using GPXPY to parse gpx file results in not well-formed invalid token error

Tags:

python

xml

gpx

I have a few gpx files which I want to parse and then feed into a GIS format. I've downloaded gpxpy because I need some of its functions rather than just wanting to extract the lat and lon from the files. But when I make a parser

import gpxpy
p = gpxpy.parse(path_to_gpx_file)

it gives me this:

ERROR:root:not well-formed (invalid token): line 1, column 2
Traceback (most recent call last):
  File "C:\Python26\ArcGIS10.0\lib\site-packages\gpxpy\parser.py", line 196, in parse
    self.xml_parser = XMLParser(self.xml)
  File "C:\Python26\ArcGIS10.0\lib\site-packages\gpxpy\parser.py", line 43, in __init__
    self.dom = mod_minidom.parseString(xml)
  File "C:\Python26\ArcGIS10.0\lib\xml\dom\minidom.py", line 1928, in parseString
    return expatbuilder.parseString(string)
  File "C:\Python26\ArcGIS10.0\lib\xml\dom\expatbuilder.py", line 940, in parseString
    return builder.parseString(string)
  File "C:\Python26\ArcGIS10.0\lib\xml\dom\expatbuilder.py", line 223, in parseString
    parser.Parse(string, True)
ExpatError: not well-formed (invalid token): line 1, column 2
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Python26\ArcGIS10.0\lib\site-packages\gpxpy\__init__.py", line 32, in parse
    return parser.parse()
  File "C:\Python26\ArcGIS10.0\lib\site-packages\gpxpy\parser.py", line 219, in parse
    raise mod_gpx.GPXXMLSyntaxException('Error parsing XML: %s' % str(e), e)
GPXXMLSyntaxException: Error parsing XML: not well-formed (invalid token): line 1, column 2

After spending some time googling, this lead me to suspect that there are errors in the xml structure. However, I can't spot them.

I've used http://www.validome.org/xml/validate/ to validate the files but it says they're valid.

This is what my gpx files look like. I've reduced this one to include only 3 trackpoints, but it's still giving me the same error as the full (35k lines)file.

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1"
     xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"
     xmlns:wptx1="http://www.garmin.com/xmlschemas/WaypointExtension/v1"
     xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
     creator="Dakota 20" version="1.1"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
    <metadata>
        <link href="http://www.garmin.com">
            <text>Garmin International</text>
        </link>
        <time>2015-03-01T16:59:53Z</time>
    </metadata>
    <trk>
        <name>SKI1</name>
        <extensions>
            <gpxx:TrackExtension></gpxx:TrackExtension>
        </extensions>
        <trkseg>
            <trkpt lat="43.3737357836" lon="130.0217922572">
                <ele>166.26</ele>
                <time>2015-03-01T08:34:40Z</time>
            </trkpt>
            <trkpt lat="43.3737673834" lon="130.0218102783">
                <ele>166.22</ele>
                <time>2015-03-01T08:34:42Z</time>
            </trkpt>
            <trkpt lat="43.3737869971" lon="130.0217925087">
                <ele>166.78</ele>
                <time>2015-03-01T08:35:02Z</time>
            </trkpt>
        </trkseg>
    </trk>
</gpx>

EDIT maybe should add: using python 2.6, gpxpy 0.9.8, pycharm 3.1.1

like image 222
Menno Avatar asked Dec 14 '22 16:12

Menno


1 Answers

It isn't really documented anywhere (in my opinion), so I'll post it here. Instead of letting the parser try to open the file, generate a file object first, and feed that to the parser, so:

import gpxpy
f = open(path_to_gpx_file, 'r')
p = gpxpy.parse(f)

I don't know why I didn't try that before...

like image 93
Menno Avatar answered May 12 '23 03:05

Menno