From: altinsel Date: 2008-09-16T05:52:55+09:00 Subject: Re: ruby / rexml / xpath bug? Thank you for your reply, Robert. Here is the code with output and puts of the XML (the Stores are coming from a local database). Does this help? ##CODE## require 'open-uri' require 'rexml/document' # Retrieve geocode information for all records in the Stores table task :google_geocode => :environment do api_key=GOOGLE_MAPS_KEY (Store.find :all).each do |store| puts "\nStore: #{store.name}" puts "Source Address: #{store.full_address}" xml=open("http://maps.google.com/maps/geo? q=#{CGI.escape(store.full_address)}&output=xml&key=#{api_key}").read doc=REXML::Document.new(xml) puts "Status: "+doc.elements['//kml/Response/Status/code'].text if doc.elements['//kml/Response/Status/code'].text != '200' puts "Unable to parse Google response for #{store.name}" else puts doc doc.root.each_element('//Response') do |response| puts "****" puts response puts "****" response.each_element('//Placemark') do |place| # puts "****" # puts place.elements['//Point']; # puts "****" lng,lat=place.elements['Point/ coordinates'].text.split(',') puts " Result Address: " << place.elements['// address'].text puts " ID: " << place.attributes['id'] puts " Latitude: #{lat}" puts " Longitude: #{lng}" puts "^^^^^^^^^^^^^^^^^^^^^^^^^" end # end each place end # end each response end # end if result == 200 end # end each store end # end rake task ##OUTPUT## rake google_geocode (in /Users/acar/Documents/Design/Code/magicmaponrails) Store: The Original Ron Jon Surf Shop Source Address: 901 Central Avenue, Long Beach Island, NJ, 08008 Status: 200 901 Central Avenue, Long Beach Island, NJ, 08008200geocode
901 Central Ave, Beach Haven, NJ 08008, USAUSNJBeach Haven901 Central Ave08008-74.107299,39.756819,0 **** 901 Central Avenue, Long Beach Island, NJ, 08008200geocode
901 Central Ave, Beach Haven, NJ 08008, USA
USNJBeach Haven901 Central Ave08008-74.107299,39.756819,0
**** Result Address: 901 Central Ave, Beach Haven, NJ 08008, USA ID: p1 Latitude: 39.756819 Longitude: -74.107299 ^^^^^^^^^^^^^^^^^^^^^^^^^ Store: One of aKind Ron Jon Surf Shop Source Address: 4151 North Atlantic Avenue, Cocoa Beach, FL, 32931 Status: 200 4151 North Atlantic Avenue, Cocoa Beach, FL, 32931200geocode
4151 N Atlantic Ave, Cocoa Beach, FL 32931, USA
USFLCocoa Beach4151 N Atlantic Ave32931-80.608106,28.356747,0
**** 4151 North Atlantic Avenue, Cocoa Beach, FL, 32931200geocode
4151 N Atlantic Ave, Cocoa Beach, FL 32931, USA
USFLCocoa Beach4151 N Atlantic Ave32931-80.608106,28.356747,0
**** Result Address: 4151 N Atlantic Ave, Cocoa Beach, FL 32931, USA ID: p1 Latitude: 28.356747 Longitude: -80.608106 ^^^^^^^^^^^^^^^^^^^^^^^^^ Store: Ron Jon Surf Shop - Sunrise Source Address: 2610 Sawgrass Mills Circle, Sunrise, FL, 33323 Status: 200 2610 Sawgrass Mills Circle, Sunrise, FL, 33323200geocode
2610 Sawgrass Mills Cir, Fort Lauderdale, FL 33323, USA
USFLFort Lauderdale2610 Sawgrass Mills Cir33323-80.315710,26.154207,0
**** 2610 Sawgrass Mills Circle, Sunrise, FL, 33323200geocode
2610 Sawgrass Mills Cir, Fort Lauderdale, FL 33323, USA
USFLFort Lauderdale2610 Sawgrass Mills Cir33323-80.315710,26.154207,0
**** Result Address: 2610 Sawgrass Mills Cir, Fort Lauderdale, FL 33323, USA ID: p1 Latitude: 26.154207 Longitude: -80.315710 ^^^^^^^^^^^^^^^^^^^^^^^^^ Store: Ron Jon Surf Shop - Orlando Source Address: 5160 International Drive, Orlando, FL, 32819 Status: 200 5160 International Drive, Orlando, FL, 32819200geocode
5160 International Dr, Orlando, FL 32819, USA
USFLOrlando5160 International Dr32819-81.450308,28.469598,0
**** 5160 International Drive, Orlando, FL, 32819200geocode
5160 International Dr, Orlando, FL 32819, USA
USFLOrlando5160 International Dr32819-81.450308,28.469598,0
**** Result Address: 5160 International Dr, Orlando, FL 32819, USA ID: p1 Latitude: 28.469598 Longitude: -81.450308 ^^^^^^^^^^^^^^^^^^^^^^^^^ Store: Ron Jon Surf Shop - Key West Source Address: 503 Front Street`, Key West, FL, 33040 Status: 200 503 Front Street`, Key West, FL, 33040200geocode
503 Front St, Key West, FL 33040, USA
USFLKey West503 Front St33040-81.805852,24.560319,0
**** 503 Front Street`, Key West, FL, 33040200geocode
503 Front St, Key West, FL 33040, USA
USFLKey West503 Front St33040-81.805852,24.560319,0
**** Result Address: 503 Front St, Key West, FL 33040, USA ID: p1 Latitude: 24.560319 Longitude: -81.805852 ^^^^^^^^^^^^^^^^^^^^^^^^^ Store: Ron Jon Surf Shop - California Source Address: 20 City Blvd., Orange, CA, 92868 Status: 200 20 City Blvd., Orange, CA, 92868200geocode
20 City Blvd W, Orange, CA 92868, USA
USCAOrange20 City Blvd W92868-117.892764,33.782893,0
20 City Blvd E, Orange, CA 92868, USA
USCAOrange20 City Blvd E92868-117.891102,33.784368,0
**** 20 City Blvd., Orange, CA, 92868200geocode
20 City Blvd W, Orange, CA 92868, USA
USCAOrange20 City Blvd W92868-117.892764,33.782893,0
20 City Blvd E, Orange, CA 92868, USA
USCAOrange20 City Blvd E92868-117.891102,33.784368,0
**** Result Address: 20 City Blvd W, Orange, CA 92868, USA ID: p1 Latitude: 33.782893 Longitude: -117.892764 ^^^^^^^^^^^^^^^^^^^^^^^^^ Result Address: 20 City Blvd W, Orange, CA 92868, USA ID: p2 Latitude: 33.784368 Longitude: -117.891102 ^^^^^^^^^^^^^^^^^^^^^^^^^ Store: Ron Jon Cape Caribe Resort Source Address: 1000 Shorewood Drive, Cape Canaveral, FL, 32920 Status: 200 1000 Shorewood Drive, Cape Canaveral, FL, 32920200geocode
1000 Shorewood Dr, Cape Canaveral, FL 32920, USA
USFLCape Canaveral1000 Shorewood Dr32920-80.598021,28.405217,0
**** 1000 Shorewood Drive, Cape Canaveral, FL, 32920200geocode
1000 Shorewood Dr, Cape Canaveral, FL 32920, USA
USFLCape Canaveral1000 Shorewood Dr32920-80.598021,28.405217,0
**** Result Address: 1000 Shorewood Dr, Cape Canaveral, FL 32920, USA ID: p1 Latitude: 28.405217 Longitude: -80.598021 ^^^^^^^^^^^^^^^^^^^^^^^^^ On Sep 15, 1:16 pm, Robert Klemme wrote: > On 15.09.2008 21:38, altinsel wrote: > > > > > I'm doing something I would think is very straight-forward but am > > getting the strangest result.  I'm wondering if anyone could help to > > let me know if this is a bug or if I'm doing something I can't see.. > > > I copied a Google Maps script from Google Maps with Rails and Ajax > > straight from code.  It requests a geocoding from Google and parses > > the XML using rexml.  When it gets to the address with 2 results, the > > "each" iterator is looping through, but on the second element is > > giving me info from the first.  below is the script exactly. > > > require 'open-uri' > > require 'rexml/document' > > > # Retrieve geocode information for all records in the Stores table > > task :google_geocode => :environment do > >   api_key=GOOGLE_MAPS_KEY > > >     (Store.find :all).each do |store| > > >       puts "\nStore: #{store.name}" > >       puts "Source Address: #{store.full_address}" > > >       xml=open("http://maps.google.com/maps/geo? > > q=#{CGI.escape(store.full_address)}&output=xml&key=#{api_key}").read > >       doc=REXML::Document.new(xml) > > >       puts "Status: "+doc.elements['//kml/Response/Status/code'].text > > >       if doc.elements['//kml/Response/Status/code'].text != '200' > >         puts "Unable to parse Google response for #{store.name}" > >       else > >         doc.root.each_element('//Response') do |response| > >           response.each_element('//Placemark') do |place| > >             #there are 2 "Placemarks" in one particular "Response" > >             lng,lat=place.elements['Point/ > > coordinates'].text.split(',') > > This seems weird: you search for potential multiple elements but use > method "text" on the result.  Not sure what this is going to yield but > I'd rather iterate. > > >             puts "  Result Address: " << place.elements['// > > address'].text > > see above > > > > >             # the address, lat and lng come from the 1st element twice > >             puts "  ID: " << place.attributes['id'] > >             # .. but the 'id' is correct. > >             puts "  Latitude: #{lat}" > >             puts "  Longitude: #{lng}" > >           end # end each place > >         end # end each response > >       end # end if result == 200 > >     end # end each store > >   end # end rake task > > > ##### > > > What I don't understand, is that the XML for each "place" is correct, > > but the place.elements['//address'] keeps finding the previous > > iterations information. How can this be? > > Hm, weird.  Are you sure the XML is as expected? > > Btw, you can combine searching for //Response and //Placemark in one > since you do not do anything with "Response". > > Kind regards > >         robert