ActiveResource должен игнорировать корневой элемент xml

Я пытаюсь подключиться к службе REST, как это

class Node < ActiveResource::Base
  self.site = "http://www.openstreetmap.org/api/0.6/"
  self.element_name = "node"  
  self.collection_name = "node"
  self.format = ActiveResource::Formats::XmlFormat 
end

однако возвращенный объект неверен. По-видимому, он читает весь ответ, включая корневой элемент (пример xml здесь). Как мне сказать ActiveResource игнорировать корневой элемент?

Возвращаемый объект

#<Node:0x97952a8 @attributes={"version"=>"0.6", "generator"=>"OpenStreetMap server", "copyright"=>"OpenStreetMap and contributors", "attribution"=>"http://www.openstreetmap.org/copyright", "license"=>"http://opendatacommons.org/licenses/odbl/1-0/", "node"=>#<Node:0x9794740 @attributes={"id"=>"367861148", "changeset"=>"872060", "timestamp"=>"2009-03-31T12:00:25Z", "version"=>"1", "visible"=>"true", "user"=>"pavel", "uid"=>"1066", "lat"=>"50.0077", "lon"=>"14.717027", "tag"=>[#<Node::Tag:0x9925104 @attributes={"k"=>"amenity", "v"=>"restaurant"}, @prefix_options={}, @persisted=true>, #<Node::Tag:0x99249fc @attributes={"k"=>"created_by", "v"=>"andnav.org"}, @prefix_options={}, @persisted=true>, #<Node::Tag:0x9924150 @attributes={"k"=>"name", "v"=>"restaurace"}, @prefix_options={}, @persisted=true>]}, @prefix_options={}, @persisted=true>}, @prefix_options={}, @persisted=true> 

но это должно быть просто значение «ключа узла».


person gorn    schedule 13.06.2014    source источник


Ответы (2)


Возвращаемый объект не является неверным. Это именно то, что должен возвращать API. Что вы имеете в виду под значением ключа узла? Очевидно, вы уже знаете идентификатор узла. Вы хотите место? теги? Вам нужно проанализировать возвращенную XML-структуру для всех интересующих вас ключей, это должно быть довольно просто .

person scai    schedule 13.06.2014
comment
Я не думаю, что я должен анализировать структуру XML, AFAIK ActiveResource предназначен для замены ActiveRecord с той разницей, что он взаимодействует не с базой данных, а с веб-службой REST. Поэтому я ожидал, что он должен вернуть объект (здесь Node), и хотя ответ относится к классу Node, он не содержит данных Node (он содержит их, но глубже в структуре). - person gorn; 13.06.2014
comment
Но как ActiveResource должен знать, какая часть XML-структуры актуальна для вас, а какая нет? - person scai; 13.06.2014
comment
Не должно, есть много вариантов конфигурации, где я могу это сказать, но я не нашел ни одного для этой цели. Я был бы даже рад взломать какой-нибудь метод ActiveResource, но после краткого просмотра исходного кода я не смог сказать, где выполняется синтаксический анализ. - person gorn; 13.06.2014

попробуйте использовать пользовательский форматтер

class MyXMLFormatter
  include ActiveResource::Formats::XmlFormat

  def decode(xml)
    ActiveResource::Formats::XmlFormat.decode(xml)['node']
  end
end

class Node < ActiveResource::Base
  self.format = MyXMLFormatter.new
end  
person Fivell    schedule 24.06.2014
comment
Это выглядит хорошо, я попробую ... Кстати, есть ли причина, по которой нужно включать форматировщик, а не просто наследовать его? то есть class MyXMLFormatter << ActiveResource::Formats::XmlFormat - person gorn; 30.06.2014
comment
@gorm, вариантов много, но ActiveResource::Formats::XmlFormat — это модуль, а не класс - person Fivell; 30.06.2014