Make notes GPX valid and add useful official elements
authorMarkus Heidelberg <markus.heidelberg@web.de>
Mon, 10 Aug 2015 18:07:23 +0000 (19:07 +0100)
committerTom Hughes <tom@compton.nu>
Mon, 10 Aug 2015 18:11:18 +0000 (19:11 +0100)
The "creator" attribute is required and "extensions" is the correct
name of this element.

Validated with SAXCount from the xerces-c package:

$ SAXCount -v=always -n -s -f notes.gpx

Original error messages:

    Error at file /home/markus/notes.gpx, line 2, char 171
      Message: no declaration found for element 'gpx'

    Error at file /home/markus/notes.gpx, line 2, char 171
      Message: attribute 'version' is not declared for element 'gpx'

After adding the "xmlns" attribute:

    Error at file /home/markus/notes.gpx, line 2, char 213
      Message: missing required attribute 'creator'

    Error at file /home/markus/notes.gpx, line 18, char 14
      Message: no declaration found for element 'extension'

    Error at file /home/markus/notes.gpx, line 26, char 7
      Message: element 'extension' is not allowed for content model '(ele?,time?,magvar?,geoidheight?,name?,cmt?,desc?,src?,link*,sym?,type?,fix?,sat?,hdop?,vdop?,pdop?,ageofdgpsdata?,dgpsid?,extensions?)'

The current errors now are caused by the missing XML schema for the
extensions.

Also add the time, name and link elements.

app/views/notes/_note.gpx.builder
app/views/notes/index.gpx.builder
app/views/notes/show.gpx.builder
test/controllers/notes_controller_test.rb

index a55ed88..8a96db8 100644 (file)
@@ -1,9 +1,14 @@
 xml.wpt("lon" => note.lon, "lat" => note.lat) do
+  xml.time note.created_at.to_s(:iso8601)
+  xml.name t("browse.note.title", :id => note.id)
+
   xml.desc do
     xml.cdata! render(:partial => "description", :object => note, :formats => [ :html ])
   end
 
-  xml.extension do
+  xml.link("href" => browse_note_url(note, :host => SERVER_URL))
+
+  xml.extensions do
     xml.id note.id
     xml.url note_url(note, :format => params[:format])
 
index 5a7f34d..5207ec3 100644 (file)
@@ -1,6 +1,8 @@
 xml.instruct!
 
 xml.gpx("version" => "1.1", 
+        "creator" => "OpenStreetMap.org",
+        "xmlns" => "http://www.topografix.com/GPX/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") do
   xml << (render(:partial => "note", :collection => @notes) || "")
index e54d772..8bb6c96 100644 (file)
@@ -1,6 +1,8 @@
 xml.instruct!
 
 xml.gpx("version" => "1.1", 
+        "creator" => "OpenStreetMap.org",
+        "xmlns" => "http://www.topografix.com/GPX/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") do
   xml << render(:partial => "note", :object => @note)
index b0fc3e1..8dc0866 100644 (file)
@@ -510,7 +510,7 @@ class NotesControllerTest < ActionController::TestCase
     assert_equal "application/gpx+xml", @response.content_type
     assert_select "gpx", :count => 1 do
       assert_select "wpt[lat='#{notes(:open_note).lat}'][lon='#{notes(:open_note).lon}']", :count => 1 do
-        assert_select "extension", :count => 1 do
+        assert_select "extensions", :count => 1 do
           assert_select "id", notes(:open_note).id
           assert_select "url", note_url(notes(:open_note), :format => "gpx")
           assert_select "comment_url", comment_note_url(notes(:open_note), :format => "gpx")