Re: [Gpsbabel-code] patch: gpx default output version detection, gpx validity
Brought to you by:
robertl
From: tsteven4 <tst...@gm...> - 2011-11-13 00:08:30
|
Hi Robert, The new test demonstrates the automatic setting of the gpx output version. It does not demonstrate the production of invalid gpx 1.0 output from valid gpx 1.1 input. However the output the test produces without the gpx.c patch, transfor-ver.gpx, cannot be validated without supplying the 1.0 schema location to the validator as it is not referenced in the gpx file. Instead, due to the weird schmaLocation handling described in the code the 1.1 schemaLocation is provided even though the output defaults to 1.0. I note that the schemaLocations were dropped from kml output in 1.4.0. Dropping them from gpx output would simplify things. Notice gpxver is not set on the command line. The gpx.c patch will result in the output version being 1.1. > gpsbabel -i gpx -f ${REFERENCE}/expertgps.gpx -x nuketypes,routes,tracks -x transform,rte=wpt,del=y -o gpx -F ${TMPDIR}/transform-ver.gpx This is the result of the new test running without the gpx.c patch. With the gpx.c patch there is no difference. > Running testo.d/classic-3.test > --- /tmp/gpsbabel.5459/transform-ver.gpx 2011-11-12 16:02:00.000000000 -0700 > +++ ./reference/transform-rte.gpx 2011-11-12 15:59:52.000000000 -0700 > @@ -1,12 +1,14 @@ > <?xml version="1.0" encoding="UTF-8"?> > <gpx > - version="1.0" > + version="1.1" > creator="GPSBabel - http://www.gpsbabel.org" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > - xmlns="http://www.topografix.com/GPX/1/0" > + 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"> > +<metadata> > <time>1970-01-01T00:00:00Z</time> > <bounds minlat="42.401051000" minlon="-71.126602000" maxlat="42.468655000" maxlon="-71.102973000"/> > +</metadata> > <rte> > <rtept lat="42.438878000" lon="-71.119277000"> > <ele>44.586548</ele> > ERROR comparing /tmp/gpsbabel.5459/transform-ver.gpx ./reference/transform-rte.gpx As far as your contention that email, url, urlname elements are legal inside a metadata element in gpx 1.1 I beg to differ. From the 1.1 xsd you can see that email, url, urlname do not appear anywhere in the sequence for the metadataType, and they certainly aren't allowed between the author element and the time element. I think they could be children of an extensions element that was in the proper sequence, but that is certainly not what the current code does and I have not been successful in a stab at doing this. I discovered this attempting to validate a gpx file produced by gpsbabel without the portion of the gpx.c patch you have raised a concern about (and it was a complex case of mixed version inputs). With the patch it did validate, although I certainly count myself lucky that this was the case. As an example here is what my validator thinks of a metadata element that contains only a url element in a gpx 1.1 file: > Message: no declaration found for element 'url' > Message: element 'url' is not allowed for content model '(name?,desc?,author?,copyright?,link*,time?,keywords?,bounds?,extensions?)' With a bit of work the 1.0 url element value could be translated to the a 1.1 link element, but I was encouraged to be lazy by the comment a few lines above about the author element: "since it's optional, we just drop it instead of rewriting it." Let me know what you think. Here is a relevant piece of the GPX 1.1 xsd: > <xsd:complexType name="metadataType"> > <xsd:annotation> > <xsd:documentation> > Information about the GPX file, author, and copyright restrictions goes in the metadata section. Providing rich, > meaningful information about your GPX files allows others to search for and use your GPS data. > </xsd:documentation> > </xsd:annotation> > <xsd:sequence> <!-- elements must appear in this order --> > <xsd:element name="name" type="xsd:string" minOccurs="0"> > <xsd:annotation> > <xsd:documentation> > The name of the GPX file. > </xsd:documentation> > </xsd:annotation> > </xsd:element> > <xsd:element name="desc" type="xsd:string" minOccurs="0"> > <xsd:annotation> > <xsd:documentation> > A description of the contents of the GPX file. > </xsd:documentation> > </xsd:annotation> > </xsd:element> > <xsd:element name="author" type="personType" minOccurs="0"> > <xsd:annotation> > <xsd:documentation> > The person or organization who created the GPX file. > </xsd:documentation> > </xsd:annotation> > </xsd:element> > <xsd:element name="copyright" type="copyrightType" minOccurs="0"> > <xsd:annotation> > <xsd:documentation> > Copyright and license information governing use of the file. > </xsd:documentation> > </xsd:annotation> > </xsd:element> > <xsd:element name="link" type="linkType" minOccurs="0" maxOccurs="unbounded"> > <xsd:annotation> > <xsd:documentation> > URLs associated with the location described in the file. > </xsd:documentation> > </xsd:annotation> > </xsd:element> > <xsd:element name="time" type="xsd:dateTime" minOccurs="0"> > <xsd:annotation> > <xsd:documentation> > The creation date of the file. > </xsd:documentation> > </xsd:annotation> > </xsd:element> > <xsd:element name="keywords" type="xsd:string" minOccurs="0"> > <xsd:annotation> > <xsd:documentation> > Keywords associated with the file. Search engines or databases can use this information to classify the data. > </xsd:documentation> > </xsd:annotation> > </xsd:element> > <xsd:element name="bounds" type="boundsType" minOccurs="0"> > <xsd:annotation> > <xsd:documentation> > Minimum and maximum coordinates which describe the extent of the coordinates in the file. > </xsd:documentation> > </xsd:annotation> > </xsd:element> > > <xsd:element name="extensions" type="extensionsType" minOccurs="0"> > <xsd:annotation> > <xsd:documentation> > You can add extend GPX by adding your own elements from another schema here. > </xsd:documentation> > </xsd:annotation> > </xsd:element> > </xsd:sequence> > </xsd:complexType> Best Regards, Steve On 11/12/2011 2:38 PM, Robert Lipe wrote: > > Hi, Steve. > On Sat, Nov 12, 2011 at 10:38 AM, tsteven4 <tst...@gm... > <mailto:tst...@gm...>> wrote: > > > 1. Enhancement/Fix. If the gpx output version isn't specified on the > command line, and gpx input version(s) exist, use the highest input > version for output. A test is included to demonstrate this > automatically detecting GPX 1.1 input and writing GPX 1.1 output. In > some cases with GPX 1.1 input this change can result in valid GPX 1.1 > output being automatically produced, instead of invalid GPX 1.0 output. > > > Mixing those is always a problem. The extension mechanisms for the two > are incompatible so if you try to merge two together, we end up > scrambling them pretty badly. But you're right that we can do better, > so I'm OK with this part. Does your change to testo really do what you > describe above? > > > 2. Fix. The email, url, urlname elements are not legal in GPX 1.1. Do > not output these elements if the output version is > 1.0. > > > Actually, they're legal inside <metadata> and the code above (around > line 1935) writes a <metadata> tag around these. Please reconsider > this part of the patch as this seems to break that. > > I'll submit once I hear back on that. > > Thanx, > RJL |