GPX parsers - gps-touring/cmd-line-tools GitHub Wiki
GPX Parsers
Creating GPX parsers from XML Schema
There exists XML schema for GPX 1.1. This page contains notes on experiments aimed at generating a GPX parser from this XSD.
Progress report
Get the XSD file:
gps-touring/cmd-line-tools/gpx-parser$ git clone https://github.com/rubyjedi/soap4r.git
Experiment with soap4r
This answer on stackoverflow leads us to look at https://github.com/rubyjedi/soap4r.
$ git clone https://github.com/rubyjedi/soap4r.git
$ sudo gem install soap4r-ng -n/usr/local/bin
(-n/usr/local/bin
is a work-around for recent versions of Mac OS/X (see stackoverflow - probably not needed on linux)
Does xsd2ruby.rb
run?
soap4r$ bin/xsd2ruby.rb
Usage: bin/xsd2ruby.rb --xsd xsd_location [options]
xsd_location: filename or URL
Example:
bin/xsd2ruby.rb --xsd myapp.xsd --classdef foo
Options:
--xsd xsd_location
--classdef [filenameprefix]
--mapping_registry
--mapper
--module_path [Module::Path::Name]
--force
--quiet
So far so good. Can it generate ruby?
soap4r$ bin/xsd2ruby.rb --xsd ../gps-touring/cmd-line-tools/gpx-parser/gpx1_1.xsd --classdef foo
I, [2017-03-20T12:36:54.965942 #12870] INFO -- app: Creating class definition.
I, [2017-03-20T12:36:54.966046 #12870] INFO -- app: Creates file 'foo.rb'.
I, [2017-03-20T12:36:54.987978 #12870] INFO -- app: End of app. (status: 0)
soap4r$ less foo.rb
soap4r$ ruby foo.rb
So we have generated ruby classes that correspond to the XSD.
Unfortunately, the generated code does not contain a parser.
This means that we would need to use an XML library (e.g. nokogiri) to parse the GPX,
and call the constructors in the generated foo.rb
.
Looking at the generated code in foo.rb
, there seems to be no use of the low-level type information (e.g. xsd:decimal
) from the XSD -- that is not a good thing!
Conclusion for now: The xsd2ruby.rb
script from soap4r is lacking some vital ingredients.
Experiment with rxsd
RXSD looked promising, but on following the usage example (after substituting the GPX XSD and a GPX file into their example), the example crashed. It seems that I had managed to reproduce an RXSD bug.
Conclusion: RXSD does not work for the GPX example I gave it.